首页 文章

UWP等效于PHP mcrypt_encrypt方法

提问于
浏览
-1

我需要帮助来找到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模式?

谢谢 . 塞缪尔

1 回答

  • 0

    所以,我的问题是在我的字符串到字节数组转换 . 我使用了以下方法(您将在其他帖子上检索)但在我的情况下它不起作用:

    public static byte[] StringToByteArray(string hex)
    {
        return Enumerable.Range(0, hex.Length)
            .Where(x => x % 2 == 0)
            .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
            .ToArray();
    }
    

    而正确的方法是:

    var bytes = Encoding.UTF8.GetBytes(hexString);
    

相关问题