C# AESGCM解密在MAC中失败
我必须加密一些私有字段,我找到了()类 当我只是加密和解密时,它工作正常:C# AESGCM解密在MAC中失败,c#,json,encryption,cryptography,C#,Json,Encryption,Cryptography,我必须加密一些私有字段,我找到了()类 当我只是加密和解密时,它工作正常: string nonSecretPayload = "asda23432a3@!$#@#%a"; string encryptThisStr = "CakeCat"; string key = "12345678912365478912365478965412"; var encryptAESGCM = AESGCM.SimpleEncrypt(Encoding.UTF8
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);
但是,当我将encryptAESGCM
byte[]保存为json文件中的字符串,然后在对该字符串执行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来检查密码文本是否被篡改。我所做的就是使用
Encoding.UTF8.GetString(encryptAESGCM)
将加密结果(字节[])作为字符串添加到json字符串中,然后将其保存到Couchbase。当我取回它时,我Encoding.UTF8.GetBytes(encryptAESGCM)
存储的字符串,然后尝试解密它。这会影响mac吗?有办法解决这个问题吗?还有其他问题吗?您不能对任意二进制数据应用编码.UTF8.GetString
。它只能对使用UTF-8编码字符串的结果字节进行解码。net实现将默默地损坏数据,而不是在默认情况下引发异常
您应该改为使用Base64:和进行解密时,您使用的是加密时不起作用的
salt
。很抱歉,我删除了代码,错过了将其保存到数据库的部分。我使用的salt(非保密负载)被保存,并作为var salt被检索。谢谢!这似乎解决了问题。也给了我一些可以阅读的东西。@Shaungreenewald我写的类也有重载,这些重载接受消息的字符串并返回一个以64为基数的密码文本。@jbtule谢谢,我找到了它们,在我再次破解代码后,它帮了我很大的忙。