Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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# AESGCM解密在MAC中失败_C#_Json_Encryption_Cryptography - Fatal编程技术网

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谢谢,我找到了它们,在我再次破解代码后,它帮了我很大的忙。