Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Security.Cryptography与PCLCrypto_C#_Encryption_Portable Class Library_Pcl Crypto - Fatal编程技术网

C# System.Security.Cryptography与PCLCrypto

C# System.Security.Cryptography与PCLCrypto,c#,encryption,portable-class-library,pcl-crypto,C#,Encryption,Portable Class Library,Pcl Crypto,我们正在删除系统中的许多共享功能,并将其移植到PCL库。我在使用PCLCrypto时遇到问题。我正在获取数据库中的一些现有数据,并尝试使用相同的算法对其进行解密。我得到了返回的值,但是在末尾有16个额外的字节,它们只是垃圾 见下面的代码: 使用System.Security.Cryptography的旧算法 public static string SymmetricEncrypt(this string plaintext, string key, SymmetricAlgorithm alg

我们正在删除系统中的许多共享功能,并将其移植到PCL库。我在使用PCLCrypto时遇到问题。我正在获取数据库中的一些现有数据,并尝试使用相同的算法对其进行解密。我得到了返回的值,但是在末尾有16个额外的字节,它们只是垃圾

见下面的代码: 使用System.Security.Cryptography的旧算法

public static string SymmetricEncrypt(this string plaintext, string key, SymmetricAlgorithm algorithm)
{
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5));
    byte[] plainTextBuffer = Encoding.UTF8.GetBytes(plaintext);

   var symmetricAlgorithm = new AesCryptoServiceProvider();
    symmetricAlgorithm.Key = keyBuffer;
    symmetricAlgorithm.Mode = CipherMode.ECB;

    var encryptor = symmetricAlgorithm.CreateEncryptor();
    byte[] cipherBuffer = encryptor.TransformFinalBlock(plainTextBuffer, 0, plainTextBuffer.Length);
    symmetricAlgorithm.Clear();

    return Convert.ToBase64String(cipherBuffer);
}


 public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm)
    {
        byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5));
        byte[] cipherTextBuffer = Convert.FromBase64String(cipherText);
        var symmetricAlgorithm = new AesCryptoServiceProvider();
        symmetricAlgorithm.Key = keyBuffer;
        symmetricAlgorithm.Mode = CipherMode.ECB;

        var decryptor = symmetricAlgorithm.CreateDecryptor();
        byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length);
        symmetricAlgorithm.Clear();

        return Encoding.Default.GetString(plainTextBuffer);
    }
使用PCLCrypto解密

public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) {
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5));
    byte[] cipherTextBuffer = Convert.FromBase64String(cipherText);

    ISymmetricKeyAlgorithmProvider symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(PCLCrypto.SymmetricAlgorithm.AesEcb);

    var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyBuffer);
    var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey);
   byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length);
    return UTF8Encoding.UTF8.GetString(plainTextBuffer, 0, plainTextBuffer.Length);
}
使用旧版本:plainTextBuffer为16字节,新版本为32字节


救命啊

这听起来像是一个填充问题

查看.NET中基类SymmetricAlgorithm的源代码,它是AESCryptServiceProvider的基础,默认填充为PaddingMode.PKCS7。您似乎没有定义填充模式,因此我假设默认设置仍然适用

虽然我以前没有使用过PCLCrypto库,但快速浏览一下github,有两种AESEBC算法:AESEBC和AesEcbPkcs7。AESEBC名称中没有填充模式对我来说意味着它没有填充(因此没有删除任何填充),这相当于.NET库中的PaddingMode.None

尝试在PCLCrypto中使用PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7算法,看看这是否会删除输出末尾的填充

更新

我刚刚对此进行了测试,它似乎工作正常,并移除了您将看到的填充物:

public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) {
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5));
    byte[] cipherTextBuffer = Convert.FromBase64String(cipherText);

    ISymmetricKeyAlgorithmProvider symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7);

    var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyBuffer);
    var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey);
   byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length);
    return UTF8Encoding.UTF8.GetString(plainTextBuffer, 0, plainTextBuffer.Length);
}

唯一的变化是将算法从PCLCrypto.SymmetricAlgorithm.aesebc更改为PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7

这是一个活动的GitHub项目,因此您应该在那里报告一个问题,以联系其作者。在您发布的代码的最底层,我假设您的意思是键入明文缓冲区,而不是明文。这里的困难在于GitHub项目只是访问其他API,而没有实现自己的AES。但话虽如此,我在存储库或代码中找不到这种行为的任何原因。奇怪的是,您在调用TransformFinalBlock时声明了plainTextBuffer,我认为该函数的返回值从未超过算法的实际块大小,但您确实有这些额外的字节。很抱歉,我被难住了。你是我的英雄。非常感谢你。