首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Security.Cryptography对PCLCrypto

System.Security.Cryptography对PCLCrypto
EN

Stack Overflow用户
提问于 2015-08-19 19:51:23
回答 1查看 4.1K关注 0票数 7

我们正在清除系统中的许多共享功能,并将其移植到PCL库中。我在使用PCLCrypto时遇到了问题。我正在利用数据库中的一些现有数据,并试图用相同的算法对其进行解密。我得到了这个值,但是最后还有16个字节是垃圾。

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

代码语言:javascript
复制
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解密

代码语言:javascript
复制
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字节。

帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-28 01:45:40

这听起来像是填充的问题。

查看.NET中的基类.NET的源代码,它是AesCryptoServiceProvider的基础,默认的填充是PaddingMode.PKCS7。您似乎还没有定义填充模式,所以我假设默认模式仍然适用。

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

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

更新

我刚刚测试了它,它似乎正确地工作,并移除您将看到的填充:

代码语言:javascript
复制
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.AesEcb更改为PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32104440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档