help tranlating perl expressions

D

David Bear

I am trying to translate some perl code to python and I need some advice on
making fixed sized strings. The perl code creates a sha1 signatured using a
key and a 'pad'. It creates fixed sized strings as follows:

my $klen = length($key);
my $blen = 64;
my $ipad = chr(0x36)x$blen;
my $opad = chr(0x5c)x$blen;

I don't know if I ever seen any way in python of created a fixed size
string. Can anyone show me how to implement the same statements in python?

Next, it zero-fills a string to a certain size.

if($klen <= $blen) {
$key .= "\0"x($blen-length($key)); #zero-fill to blocksize
} else {
$key = sha1($key); #if longer, pre-hash key
}

Finally it concatenates and xors these strings together like this:

return sha1($key^$opad . sha1($key^$ipad . $data));

I when python XOR's strings, is it the same as when perl xor's them?
 
E

Erik Johnson

my $klen = length($key);
my $blen = 64;
my $ipad = chr(0x36)x$blen;
my $opad = chr(0x5c)x$blen;

I don't know if I ever seen any way in python of created a fixed size
string. Can anyone show me how to implement the same statements in python?

Certainly, you can create fixed-length strings in python:
'6666666'

I when python XOR's strings, is it the same as when perl xor's them?
No, XOR is a bitwise operation that does not apply to strings.
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for ^: 'str' and 'str'

See also the 'struct' module: http://docs.python.org/lib/module-struct.html
 
F

Fredrik Lundh

David said:
> I am trying to translate some perl code to python and I need some
> advice on making fixed sized strings.

looks like you're reimplementing HMAC; there's no need to do that in
Python, really, since it's part of the standard library:

http://docs.python.org/lib/module-hmac.html

pass in hashlib.sha1 instead of the default, and you're done.

if you insist on doing it yourself, read on:
my $ipad = chr(0x36)x$blen;
my $opad = chr(0x5c)x$blen;

I don't know if I ever seen any way in python of created a fixed size
string. Can anyone show me how to implement the same statements in python?

just remove all the junk, and use multiply instead of "x":

ipad = chr(0x36) * blen
opad = chr(0x5c) * blen

however, Python strings are not mutable, so to implement the rest of
that algorithm, you probably want to use a list or array object instead.
the md5-example-4.py script on this page shows one way to do that:

http://effbot.org/librarybook/md5.htm

to get a SHA-1 hmac, you have to replace "md5" with "sha".

</F>
 
D

David Bear

Fredrik said:
looks like you're reimplementing HMAC; there's no need to do that in
Python, really, since it's part of the standard library:

http://docs.python.org/lib/module-hmac.html

pass in hashlib.sha1 instead of the default, and you're done.

if you insist on doing it yourself, read on:


just remove all the junk, and use multiply instead of "x":

ipad = chr(0x36) * blen
opad = chr(0x5c) * blen

however, Python strings are not mutable, so to implement the rest of
that algorithm, you probably want to use a list or array object instead.
the md5-example-4.py script on this page shows one way to do that:

http://effbot.org/librarybook/md5.htm

to get a SHA-1 hmac, you have to replace "md5" with "sha".

</F>

Yes, this is what I am doing. Because I am using code sold to me by a vendor
-- I was worried that they are doing something with it that had some
dependencies on the way perl was making the digest. So I was trying to
better understand the perl by doing it in python.
 
D

Dennis Lee Bieber

Yes, this is what I am doing. Because I am using code sold to me by a vendor
-- I was worried that they are doing something with it that had some
dependencies on the way perl was making the digest. So I was trying to
better understand the perl by doing it in python.

For the most part, it looks like they were trying to preset the
result to some sort of padding, then modifying parts of that to contain
the real data.

Since Python strings are immutable, one way to produce a right
padded string is just to concatenate the data with padding, then
slice...

res = "".join([data, "pad"*lngth])[:lngth]

The XOR needs to be done piecewise...; presuming both sides (a and
b) are same length (which I presume the padding is meant to achieve)

res = "".join([chr(ord(a) ^ ord(b) for i in len(a)])
--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top