我目前正试图将一个简单的AES代码从c#翻译到Python。我对这两种语言都很了解,但我对加密领域(尤其是AES)一无所知。我之前在c#中编写了这个AES代码,但现在我不知道如何使其在Python中工作(我使用PyCrypto,因为Python2.7没有内置AES)。下面是我的c#代码:
using System.Collections;
using System.Text;
using System.Security.Cryptography;
namespace DefaultClasses
{
public class SimpleAES
{
private const string KEY = "someKey";
private const string IV = "someIV";
private AesCryptoServiceProvider _aes;
private ICryptoTransform _crypto;
public SimpleAES()
{
_aes = new AesCryptoServiceProvider();
_aes.BlockSize = 128;
_aes.KeySize = 256;
_aes.Key = ASCIIEncoding.ASCII.GetBytes(KEY);
_aes.IV = ASCIIEncoding.ASCII.GetBytes(IV);
_aes.Padding = PaddingMode.PKCS7;
_aes.Mode = CipherMode.CBC;
}
public string encrypt(string message)
{
_crypto = _aes.CreateEncryptor(_aes.Key, _aes.IV);
byte[] encrypted = _crypto.TransformFinalBlock(
ASCIIEncoding.ASCII.GetBytes(message), 0, ASCIIEncoding.ASCII.GetBytes(message).Length);
_crypto.Dispose();
return System.Convert.ToBase64String(encrypted);
}
public string decrypt(string message)
{
_crypto = _aes.CreateDecryptor(_aes.Key, _aes.IV);
byte[] decrypted = _crypto.TransformFinalBlock(
System.Convert.FromBase64String(message), 0, System.Convert.FromBase64String(message).Length);
_crypto.Dispose();
return ASCIIEncoding.ASCII.GetString(decrypted);
}
}
}
请注意,我还想有BlockSize = 128, KeySize = 256, Padding = PKCS7,和Cipher CBC为Python。提前感谢!
我意识到这个问题差不多有一年了,但是我在寻找一些解决方案来与一个在AES实现中使用PKCS7填充的旧窗口进程通信时发现了它。这里有一个对我很有用的例子。希望这对以后的其他人有用。我使用了与问题作者指定的相同的块大小、键大小和填充。
from Crypto.Cipher import AES
from pkcs7 import PKCS7Encoder
import base64
shared_key = "abc123ty9TW1abc123ty9TW1" #some random key for a working example
IV = "rTF25nTrrTF25nTr"
clear_text = "Testing 123"
aes = AES.new(shared_key, AES.MODE_CBC, IV)
aes.block_size = 128
cipher_text = base64.b64encode(aes.encrypt(PKCS7Encoder().encode(clear_text)))
print(cipher_text)
aes_decrypter = AES.new(shared_key, AES.MODE_CBC, IV)
aes_decrypter.block_size = 128
clear_text = PKCS7Encoder().decode(aes_decrypter.decrypt(base64.b64decode(cipher_text)))
print(clear_text)
我使用的pkcs7填充实用程序是从Github项目复制的:
import binascii
import StringIO
class PKCS7Encoder(object):
def __init__(self, k=16):
self.k = k
## @param text The padded text for which the padding is to be removed.
# @exception ValueError Raised when the input padding is missing or corrupt.
def decode(self, text):
'''
Remove the PKCS#7 padding from a text string
'''
nl = len(text)
val = int(binascii.hexlify(text[-1]), 16)
if val > self.k:
raise ValueError('Input is not padded or padding is corrupt')
l = nl - val
return text[:l]
## @param text The text to encode.
def encode(self, text):
'''
Pad an input string according to PKCS#7
'''
l = len(text)
output = StringIO.StringIO()
val = self.k - (l % self.k)
for _ in xrange(val):
output.write('%02x' % val)
return text + binascii.unhexlify(output.getvalue())