2013-12-11 23 views
5

staram się komunikować z AutoIt z serwerem Python TCP przy użyciu szyfrowania, ale myślę, że coś jest nie tak z moimi algorytmów od wyników obu encryptions/decryptions są różne:AutoIt do Pythona szyfrowania/deszyfrowania

Auto:

#include <Crypt.au3> 

Global $key = "pjqFX32pfaZaOkkCFQuYziOApaBgRE1Y"; 
Global $str = "Am I welcome???" 
_Crypt_Startup() 
$hKey = _Crypt_DeriveKey($key, $CALG_AES_256) 
$s = _Crypt_EncryptData($str, $hKey, $CALG_USERKEY) 
$s = _Base64Encode($s) 
ConsoleWrite("Encrypted: " & $s & @CRLF) 
$s = _Base64Decode($s) 
$str = _Crypt_DecryptData($s, $hKey, $CALG_USERKEY) 
ConsoleWrite("Decrypted: " & BinaryToString($str) & @CRLF) 

AutoIt wyjściowa:

Encrypted: ZFBnThUDPRuIUAPV6vx9Ng== 
Decrypted: Am I welcome??? 

Python:

#!/usr/bin/env python 

from Crypto.Cipher import AES 
import base64 
import binascii 

BLOCK_SIZE = 16 

PADDING = binascii.unhexlify(b"07") 

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 = 'pjqFX32pfaZaOkkCFQuYziOApaBgRE1Y' 
cipher=AES.new(key=secret, mode=AES.MODE_ECB) 

encoded = EncodeAES(cipher, 'Am I welcome???') 
print 'Encrypted string:', encoded 

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

wyjście Python:

Encrypted string: NDJepp4CHh5C/FZb4Vdh4w== 
Decrypted string: Am I welcome??? 

Zaszyfrowane wyniki są nie takie same ...

Gdzie jest mój "błąd"?

+0

Początkowo sądziłem, że jest to problem z kodowaniem ciągów znaków, ale wypróbowałem wszystko, co mogę wymyślić w AutoIt i nie mogę uzyskać tego samego wyniku co Twój kod Pythona. Czy [this] (http://stackoverflow.com/a/12221931/611562) dotyczy Twojego kodu Pythona? – Matt

+0

To naprawdę wydaje się być problemem po stronie Pythona. Uruchomiłem KAT z plików NIST przeciwko części AutoIT i przeszło cały test. PyCrypto nie przekazał go. Tak myślę, że muszę znaleźć inną implementację AES dla Pythona. Zobacz także: http://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto/#comment-979860 –

+0

Wydaje się, że znalazłem "problem" ... AutoIT domyślnie używa 0x00 do wypełniania, a python używa 0x20. Ja sam odpowiem, gdy tylko zaktualizuję kod. Dzięki Matt. –

Odpowiedz

6

Problem może być rozwiązany przez zmianę Uszczelki i używając innej realizacji AES Auto:

rijndael.au3 stąd: http://www.autoitscript.com/forum/topic/44581-crypto-suite/

Auto:

#include <rijndael.au3> 
#include <String.au3> 

Global $key = "pjqFX32pfaZaOkkC"; 
Global $text = "Am I welcome???" 
$encrypted = _StringToHex(BinaryToString(_rijndaelCipher($key, $text, 128, 0, ''))) 
ConsoleWrite("Encrypted: " & $encrypted & @CRLF) 
$decrypted = BinaryToString(_rijndaelInvCipher($key, _HexToString($encrypted), 128, 0, '')) 
ConsoleWrite("Decrypted: " & $decrypted & @CRLF) 

wyjściowa:

Encrypted: A6848F1EF8C7C1313689E18567235A93 
Decrypted: Am I welcome??? 

Python:

#!/usr/bin/env python 

from Crypto.Cipher import AES 
import base64 

BLOCK_SIZE = 16 

PADDING = chr(0) 

pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

EncodeAES = lambda c, s: base64.b16encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b16decode(e)).rstrip(PADDING) 

text = 'Am I welcome???' 
secret = 'pjqFX32pfaZaOkkC' 

cipher=AES.new(key=secret, mode=AES.MODE_ECB) 

encoded = EncodeAES(cipher, text) 
print 'Python Encrypted string: ', encoded 

decoded = DecodeAES(cipher, encoded) 
print 'Python Decrypted string: ', decoded.encode("hex") 
print 'Python Decrypted string: ', decoded 

myencoded = "A6848F1EF8C7C1313689E18567235A93" 
print "AutoIt Result:   ", myencoded 
decoded = DecodeAES(cipher, myencoded) 
print 'From AU Decrypted string:', decoded 
mydecoded = EncodeAES(cipher, decoded) 
print 'Re-Encrypted string:  ', mydecoded.upper() 

wyjściowa:

Python Encrypted string: A6848F1EF8C7C1313689E18567235A93 
Python Decrypted string: 416d20492077656c636f6d653f3f3f 
Python Decrypted string: Am I welcome??? 
AutoIt Result:   A6848F1EF8C7C1313689E18567235A93 
From AU Decrypted string: Am I welcome??? 
Re-Encrypted string:  A6848F1EF8C7C1313689E18567235A93 

Nie kontynuować stosowanie kodowania base64/dekodowanie od wysłania surowego binarny jest dobre dla strumieni TCP.