3

我必须加密一些私有字段,并且使用 AESGCM找到( jbtule 的)类。

当我只是加密和解密它工作正常:

string nonSecretPayload = "asda23432a3@!$#@#%a";                        
string encryptThisStr = "CakeCat";
string key = "12345678912365478912365478965412";

var encryptAESGCM = AESGCM.SimpleEncrypt(Encoding.UTF8.GetBytes(encryptThisStr), Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(nonSecretPayload));

//addedJson += "c" + count + "{\"" + @Encoding.UTF8.GetString(encryptAESGCM) + "\"}";


var decrypyAESGCM2 = AESGCM.SimpleDecrypt(encryptAESGCM , Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(salt).Length);

但是,当我将encryptAESGCMbyte[] 保存为 json 文件中的字符串,然后在对它执行 a 之后解密该字符串Encoding.UTF8.GetBytes()时,它会失败并显示:

Org.BouncyCastle.Crypto.InvalidCipherTextException: mac check in GCM failed
       at Org.BouncyCastle.Crypto.Modes.GcmBlockCipher.DoFinal(Byte[] output, Int32
    outOff) in C:\BouncyCastle\crypto\src\crypto\modes\GCMBlockCipher.cs:line 295
       at Encryption.AESGCM.SimpleDecrypt(Byte[] encryptedMessage, Byte[] key, I
    nt32 nonSecretPayloadLength)

我看到它使用 MAC 来检查密文是否被篡改。我所做的就是将加密的结果(byte[])作为字符串添加到 json 字符串中Encoding.UTF8.GetString(encryptAESGCM),然后将其保存到 Couchbase。当我取回它时,我Encoding.UTF8.GetBytes(encryptAESGCM)存储了字符串,然后尝试解密它。这会影响mac吗?有没有解决的办法?还有问题吗?

4

1 回答 1

4

您不能应用于Encoding.UTF8.GetString任意二进制数据。它只能解码使用 UTF-8 编码字符串的结果字节。.net 实现会默默地破坏数据,而不是默认抛出异常。

您应该改用 Base64:Convert.FromBase64StringConvert.ToBase64String

于 2013-10-30T12:41:22.690 回答