【发布时间】:2016-06-09 12:29:21
【问题描述】:
我需要帮助找到与 PHP mcrypt_encrypt 方法等效的 c#。我尝试使用 Windows.Security.Cryptography 命名空间进行 AES CBC 加密,但无法使用 8 字节 IV。
这是我的代码:
var encoding = BinaryStringEncoding.Utf8;
IBuffer buffMsg = CryptographicBuffer.ConvertStringToBinary(strToEncrypt, encoding);
var objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(AES_CBC);
// strToEncrypt padding
var padding = 16 - (buffMsg.Length % 16);
if (padding > 0)
{
var buffWithPadding = new byte[buffMsg.Length + padding];
buffMsg.ToArray().CopyTo(buffWithPadding, 0);
buffMsg = CryptographicBuffer.CreateFromByteArray(buffWithPadding);
}
var key = CryptographicBuffer.CreateFromByteArray(_serverKey);
var iv = CryptographicBuffer.CreateFromByteArray(ivPadding);
IBuffer buffEncrypt = CryptographicEngine.Encrypt(objAlg.CreateSymmetricKey(key), buffMsg, iv);
return CryptographicBuffer.EncodeToBase64String(buffEncrypt);
在服务器端,mcrypt_decrypt 方法使用 AES 128 位密钥(16 字节)和 8 字节初始化向量。但是,对于 UWP 加密库,IV 的大小似乎也必须为 16 字节。
我尝试用 8 个零字节填充我的 IV。它“有效”,但结果与 mcrypt_encrypt 方法(PHP)不同。
您有什么解决方案可以使用我的 16 字节密钥和我的 8 字节 IV 在 AES CBC 模式下进行加密吗?
谢谢。 塞缪尔
【问题讨论】:
-
请显示 PHP 代码以及所有必要的输入数据和输出。
-
我无法在论坛上发布 AES 密钥和 IV (...)。但可以肯定的是,我使用相同的 AES 密钥和相同的 IV。模式是CBC。
-
另外,Android (so java) AES 类发现与 php 方法相同的结果。但是 UWP 中的问题是传递一个 8 字节的 IV。
-
Android 也不支持非标准尺寸的 IV,因此您使用它的方式一定有一些特别之处。您不必添加生产密钥和 IV,但应该添加类似的值。
-
这是一个类似的 AES 密钥:000102030405060708090A0B0C0D0E0F 这里是一个类似的 IV:0102030405060708
标签: php encryption cryptography aes uwp