【发布时间】:2012-02-03 10:31:53
【问题描述】:
我有一个加密密码,它是用 python 加密的。它使用带有固定密钥的 AES 128 加密的 base 64 编码结果进行加密。
现在我的应用程序是一个 C# 应用程序,我正在使用 RijndaelManaged 对其进行解密。我的代码是
static String Decrypt(string textToDecrypt, string key)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.Zeros;
rijndaelCipher.KeySize = 0x80; //128
rijndaelCipher.BlockSize = 0x80; //128
byte[] encryptedData = Convert.FromBase64String(textToDecrypt);
byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
byte[] keyBytes = new byte[0x10]; //16
int len = pwdBytes.Length;
if (len > keyBytes.Length)
{
len = keyBytes.Length;
}
Array.Copy(pwdBytes, keyBytes, len);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = keyBytes;
byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);
return Encoding.Unicode.GetString(plainText);
}
我知道密码是如何在python中加密的。就像
key: encryption key
s: string to be encrypted
cipher = AES.new(key, AES.MODE_CBC)
str_to_encrypt = _create_nonce() + _to_utf16(s)
encrypted = base64.b64encode(cipher.encrypt(str_to_encrypt))
_create_nonce() 根据当前时间返回一些 16 位的值。
这里的问题是我得到了前 16 个垃圾,其余的我得到了正确的结果。 可能是什么问题?我认为问题可能是 rijndaelCipher.IV。其他语言加密的rijndaelCipher.IV如何计算?
我在我的应用程序中使用 .Net 2.0,我无法更改它。 Python代码:
DEFAULT_KEY = 'SV5@9raQSV5@9raQ'
aes_encrypt(self.DEFAULT_KEY, password)
def _create_nonce():
+ t1 = time.strftime("%Y%m%d%H%M%S")
+ t2 = time.strftime("%Y%m%d%H%M%S")
+
+ return struct.pack('dd', float(t1), float(t2))
+
+
+def _to_utf16(s, max_len=32, pad='\0'):
+
+ padded = str.ljust(str(s), max_len, pad)
+ utf16_padded, _ = codecs.utf_16_be_encode(padded)
+ buffer = struct.Struct(str(max_len * 2) + 'p')
+ return buffer.pack(utf16_padded)
+
+
+def aes_encrypt(key, s):
+ This will encrypt username and/or password
+ for IP Office Manager application.
+
+ Args:
+
+ key: encryption key
+ s: string to be encrypted
+ """
+ cipher = AES.new(key, AES.MODE_CBC)
+ str_to_encrypt = _create_nonce() + _to_utf16(s)
+ encrypted = base64.b64encode(cipher.encrypt(str_to_encrypt))
+
+ return encrypted
【问题讨论】:
-
pwdBytes = Encoding.UTF8.GetBytes(key);是错误的,很弱,很可能是您问题的一部分。 -
您使用 AES(Rijndael 的特定子集)加密但使用 Rijndael 解密似乎很奇怪。为什么不使用 AesCryptoServiceProvider?它似乎更合适,并且不兼容的范围更小。 stackoverflow.com/a/4863924/14357
-
@Henk - 那我应该怎么做才能获得 pwdBytes?
-
@spender - 我会检查一下
-
你也需要发布 Python 代码。
标签: c# python encryption aes