我无法使用PHP mcrypt_encrypt进行C#RijndaelManaged加密工作,因为我一直得到"指定密钥不是此算法的有效大小"。
PHP规范使用256位,具有ECB密码模式。我的理解是在ECB模式下不使用Initization Vector。
我们正在使用临时密钥使其在开发项目中工作,继续构建开发应用程序,并且我们将在稍后发布新的安全密钥。
[PHP]
$plaintext = '1~ABCDEFG~1408740350~0~';
for($i = 1; $i <= 32; $i++) { $key .= chr($i); }
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plaintext, 'ecb', '');
[C#]
string postFormData = "1~ABCDEFG~1408740350~0~";
StringBuilder sb = new StringBuilder();
foreach (var b in Encoding.ASCII.GetBytes(String.Concat(Enumerable.Range(1, 32)))) { sb.AppendFormat("{0}", b); }
postedFormData = RijndaelAES.Encrypt(postedFormData, sb.ToString());
public static string Encrypt(string plainText, string key)
{
string cipherText;
var rijndael = new RijndaelManaged()
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
BlockSize = 256, //128,
Padding = PaddingMode.Zeros//,
//IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
ICryptoTransform encryptor = rijndael.CreateEncryptor(rijndael.Key, null);
using (var memoryStream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
using (var streamWriter = new StreamWriter(cryptoStream))
{
streamWriter.Write(plainText);
streamWriter.Flush();
}
cipherText = Convert.ToBase64String(memoryStream.ToArray());
}
}
return cipherText;
}
答案 0 :(得分:1)
Rijndael / AES的固定块大小为128(在所有实现中)。您可能需要设置密钥大小,而不是块大小。
此外,将密钥转换为字节的方式非常不寻常(实际上是惊人的)。我不认为你真的了解编码。这是一个重要的研究课题。也许,PHP版本假设字符串是ASCII。在C#中,你可以这样做:
string keyStr = ...;
Debug.Assert(keyStr.Length == (256 / 8));
byte[] keyBytesASCII = Encoding.ASCII.GetBytes(keyStr);
Debug.Assert(keyBytesASCII.Length == (256 / 8));
Debug.Assert(keyBytesASCII.Length == keyStr.Length);
将来您可以使用调试器查看重要值来调试此类问题。我认为你发现你设置的密钥不是预期的长度。