python + php encrypt/decrypt

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

python + php encrypt/decrypt

Peter Irbizon

Hello,

I would like to encrypt text in python and decrypt it in my PHP script. I tried to use pycrypto and some aes php scripts but the results are not the same. Please, is there any example (the best way source codes) how to do this in python and PHP?


--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: python + php encrypt/decrypt

hidura
Use xml to pass the encrypt text.

On , Peter Irbizon <[hidden email]> wrote:
>
> Hello,
>
> I would like to encrypt text in python and decrypt it in my PHP script. I tried to use pycrypto and some aes php scripts but the results are not the same. Please, is there any example (the best way source codes) how to do this in python and PHP?
>
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: python + php encrypt/decrypt

Peter Irbizon
Hello, thanks, Unfortunatelly I don't understand how xml should resolve my issue. My problem is:
I am trying to use aes256 cbc on python and php to decrypt "textstring". But results are not the same in php and python. Any idea why? password and iv is the same so I don't know where is the problem. I am trying do decrypt data in python then store it as base64 and read and decrypt it in php.

2011/6/4 <[hidden email]>
Use xml to pass the encrypt text.


On , Peter Irbizon <[hidden email]> wrote:
>
> Hello,
>
> I would like to encrypt text in python and decrypt it in my PHP script. I tried to use pycrypto and some aes php scripts but the results are not the same. Please, is there any example (the best way source codes) how to do this in python and PHP?
>


--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: python + php encrypt/decrypt

geremy condra-2
On Sun, Jun 5, 2011 at 3:34 AM, Peter Irbizon <[hidden email]> wrote:

> Hello, thanks, Unfortunatelly I don't understand how xml should resolve my
> issue. My problem is:
> I am trying to use aes256 cbc on python and php to decrypt "textstring". But
> results are not the same in php and python. Any idea why? password and iv is
> the same so I don't know where is the problem. I am trying do decrypt data
> in python then store it as base64 and read and decrypt it in php.
>
> 2011/6/4 <[hidden email]>
>>
>> Use xml to pass the encrypt text.
>>
>> On , Peter Irbizon <[hidden email]> wrote:
>> >
>> > Hello,
>> >
>> > I would like to encrypt text in python and decrypt it in my PHP script.
>> > I tried to use pycrypto and some aes php scripts but the results are not the
>> > same. Please, is there any example (the best way source codes) how to do
>> > this in python and PHP?

Please provide links to the AES implementation you're trying to use
from PHP and the Python and PHP code you're using.

Geremy Condra
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: python + php encrypt/decrypt

Peter Irbizon
In reply to this post by Peter Irbizon
On Jun 6, 7:41 pm, geremy condra <[hidden email]> wrote:

> On Sun, Jun 5, 2011 at 3:34 AM, Peter Irbizon <[hidden email]> wrote:
> > Hello, thanks, Unfortunatelly I don't understand how xml should resolve my
> > issue. My problem is:
> > I am trying to use aes256 cbc on python and php to decrypt "textstring". But
> > results are not the same in php and python. Any idea why? password and iv is
> > the same so I don't know where is the problem. I am trying do decrypt data
> > in python then store it as base64 and read and decrypt it in php.
>
> > 2011/6/4 <[hidden email]>
>
> >> Use xml to pass the encrypt text.
>
> >> On , Peter Irbizon <[hidden email]> wrote:
>
Hello,

php I am trying to use is here:
http://code.google.com/p/antares4pymes/source/browse/trunk/library/System/Crypt/AES.php?r=20

and python code:
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64
import os

BLOCK_SIZE = 32
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e:
c.decrypt(base64.b64decode(e)).rstrip(PADDING)
secret = "passkeypasskeyaa" #os.urandom(BLOCK_SIZE)
iv='1234567890123456'
cipher = AES.new(secret, AES.MODE_CBC, iv)
# encode a string
tajnytext ='Alice has a cat'
encoded = EncodeAES(cipher, tajnytext)
print encoded

# decode the encoded string
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:', decoded


Thank you for your help in advance

> >> > Hello,
>
> >> > I would like to encrypt text in python and decrypt it in my PHP script.
> >> > I tried to use pycrypto and some aes php scripts but the results are not the
> >> > same. Please, is there any example (the best way source codes) how to do
> >> > this in python and PHP?
>
> Please provide links to the AES implementation you're trying to use
> from PHP and the Python and PHP code you're using.
>
> Geremy Condra- Hide quoted text -
>
> - Show quoted text -

--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: python + php encrypt/decrypt

Ian Kelly-2
On Mon, Jun 6, 2011 at 4:19 PM, miamia <[hidden email]> wrote:
> php I am trying to use is here:
> http://code.google.com/p/antares4pymes/source/browse/trunk/library/System/Crypt/AES.php?r=20

That library does not appear to be doing CBC as far as I can tell.
Maybe they will agree if you use EBC instead?

> BLOCK_SIZE = 32

According to the docs, the block size for AES is 16, not 32.  It is
the key size that can be 16, 24, or 32.  But this should just result
in extra padding, so it probably doesn't explain the discrepancy.

> pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
> EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
> DecodeAES = lambda c, e:
> c.decrypt(base64.b64decode(e)).rstrip(PADDING)

Stylistic note: is it really necessary to use lambda here?  For
readability, just use def.  It's worth having to hit Enter a couple
extra times.

Cheers,
Ian
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: python + php encrypt/decrypt

Peter Irbizon

Hello Ian,

thanks, I found another php script but it is not working as well :/ What am I doing wrong?
And I have another question too: when I use text for encoding "Text for 1" and "Text for 11" the first letters of encoded strings are the same in both strings?

here is my py:
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64
import os

# the block size for the cipher object; must be 16, 24, or 32 for AES
BLOCK_SIZE = 16

# the character used for padding--with a block cipher such as AES, the value
# you encrypt must be a multiple of BLOCK_SIZE in length.  This character is
# used to ensure that your value is always a multiple of BLOCK_SIZE
PADDING = '{'

# one-liner to sufficiently pad the text to be encrypted
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

# one-liners to encrypt/encode and decrypt/decode a string
# encrypt with AES, encode with base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

# generate a random secret key
secret = "passkeypasskeyaa" #os.urandom(BLOCK_SIZE)
iv='1234567890123456'
# create a cipher object using the random secret
#cipher = AES.new(secret)
cipher = AES.new(secret, AES.MODE_CBC, iv)

# encode a string
tajnytext ='Alice has a cat'
#tajnytext=tajnytext.encode('hex')
encoded = EncodeAES(cipher, tajnytext) #encoded = EncodeAES(cipher, 'password')

print encoded
print encoded.encode('hex')
#print 'Encrypted string:', encoded


# decode the encoded string
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:', decoded

 

 


and my php:
<?php
 
 // This PHP code snippet provides a basic understanding of
 // PHP's AES encryption.

 // The first thing to understand is the meaning of these constants:
 // MCRYPT_RIJNDAEL_128
 // MCRYPT_RIJNDAEL_192
 // MCRYPT_RIJNDAEL_256
 // You would think that MCRYPT_RIJNDAEL_256 specifies 256-bit encryption,
 // but that is wrong.  The three choices specify the block-size to be used
 // with Rijndael encryption.  They say nothing about the key size (i.e. strength)
 // of the encryption.  (Read further to understand how the strength of the
 // AES encryption is set.)
 //
 // The Rijndael encyrption algorithm is a block cipher.  It operates on discrete
 // blocks of data.  Padding MUST be added such that
    // the data to be encrypted has a length that is a multiple of the block size.
 // (PHP pads with NULL bytes)
 // Thus, if you specify MCRYPT_RIJNDAEL_256, your encrypted output will always
 // be a multiple of 32 bytes (i.e. 256 bits).  If you specify MCRYPT_RIJNDAEL_128,
 // your encrypted output will always be a multiple of 16 bytes.
 //
 // Note: Strictly speaking, AES is not precisely Rijndael (although in practice
 // they are used interchangeably) as Rijndael supports a larger range of block
 // and key sizes; AES has a fixed block size of 128 bits and a key size of
 // 128, 192, or 256 bits, whereas Rijndael can be specified with key and block
 // sizes in any multiple of 32 bits, with a minimum of 128 bits and a maximum of
 // 256 bits.
 // In summary: If you want to be AES compliant, always choose MCRYPT_RIJNDAEL_128.
 //
 // So the first step is to create the cipher object:
 $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
 
 // We're using CBC mode (cipher-block chaining).  Block cipher modes are detailed
 // here: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
  
 // CBC mode requires an initialization vector.  The size of the IV (initialization
 // vector) is always equal to the block-size.  (It is NOT equal to the key size.)
 // Given that our block size is 128-bits, the IV is also 128-bits (i.e. 16 bytes).
 // Thus, for AES encryption, the IV is always 16 bytes regardless of the
 // strength of encryption.
 //
 // Here's some PHP code to verify our IV size:
 //$iv_size = mcrypt_enc_get_iv_size($cipher);
 //printf("iv_size = %d\n",$iv_size);
 
 // How do you do 256-bit AES encryption in PHP vs. 128-bit AES encryption???
 // The answer is:  Give it a key that's 32 bytes long as opposed to 16 bytes long.
 // For example:
 $key256 = 'passkeypasskeyaa';
 //$key128 = '1234567890123456';
 
 // Here's our 128-bit IV which is used for both 256-bit and 128-bit keys.
 $iv =  '1234567890123456';
 
 //printf("iv: %s\n",bin2hex($iv));
 //printf("key256: %s\n",bin2hex($key256));
 //printf("key128: %s\n",bin2hex($key128));
 
 // This is the plain-text to be encrypted:
 $cleartext = 'Alice has a cat';
 //printf("plainText: %s\n\n",$cleartext);
  
 // The mcrypt_generic_init function initializes the cipher by specifying both
 // the key and the IV.  The length of the key determines whether we're doing
 // 128-bit, 192-bit, or 256-bit encryption. 
 // Let's do 256-bit encryption here:
 if (mcrypt_generic_init($cipher, $key256, $iv) != -1)
 {
  // PHP pads with NULL bytes if $cleartext is not a multiple of the block size..
  $cipherText = mcrypt_generic($cipher,$cleartext );
  mcrypt_generic_deinit($cipher);
  
  // Display the result in hex.
  printf("256-bit encrypted result:\n%s\n\n",bin2hex($cipherText));
 }
 
 // Now let's do 128-bit encryption:
 //if (mcrypt_generic_init($cipher, $key128, $iv) != -1)
 //{
  // PHP pads with NULL bytes if $cleartext is not a multiple of the block size..
//  $cipherText = mcrypt_generic($cipher,$cleartext );
//  mcrypt_generic_deinit($cipher);
  
  // Display the result in hex.
//  printf("128-bit encrypted result:\n%s\n\n",bin2hex($cipherText));
// }
 
 // -------
 // Results
 // -------
 // You may use these as test vectors for testing your AES implementations...
 //
 // ------------------------
 // 256-bit key, CBC mode
 // ------------------------
 // IV = '1234567890123456' 
 //  (hex: 31323334353637383930313233343536)
 // Key = '12345678901234561234567890123456' 
 //  (hex: 3132333435363738393031323334353631323334353637383930313233343536)
 // PlainText:
 //  'The quick brown fox jumped over the lazy dog'
 // CipherText(hex):
 //  2fddc3abec692e1572d9b7d629172a05caf230bc7c8fd2d26ccfd65f9c54526984f7cb1c4326ef058cd7bee3967299e3

 //
 // ------------------------
 // 128-bit key, CBC mode
 // ------------------------
 // IV = '1234567890123456' 
 //  (hex: 31323334353637383930313233343536)
 // Key = '1234567890123456' 
 //  (hex: 31323334353637383930313233343536)
 // PlainText:
 //  'The quick brown fox jumped over the lazy dog'
 // CipherText(hex):
 //  f78176ae8dfe84578529208d30f446bbb29a64dc388b5c0b63140a4f316b3f341fe7d3b1a3cc5113c81ef8dd714a1c99
 
?>

2011/6/7 Ian Kelly <[hidden email]>
On Mon, Jun 6, 2011 at 4:19 PM, miamia <[hidden email]> wrote:
> php I am trying to use is here:
> http://code.google.com/p/antares4pymes/source/browse/trunk/library/System/Crypt/AES.php?r=20

That library does not appear to be doing CBC as far as I can tell.
Maybe they will agree if you use EBC instead?

> BLOCK_SIZE = 32

According to the docs, the block size for AES is 16, not 32.  It is
the key size that can be 16, 24, or 32.  But this should just result
in extra padding, so it probably doesn't explain the discrepancy.

> pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
> EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
> DecodeAES = lambda c, e:
> c.decrypt(base64.b64decode(e)).rstrip(PADDING)

Stylistic note: is it really necessary to use lambda here?  For
readability, just use def.  It's worth having to hit Enter a couple
extra times.

Cheers,
Ian


--
http://mail.python.org/mailman/listinfo/python-list