C# C++;(加密和加密)和C加密匹配
为了客户机和服务器之间的安全通信,我想对来自客户机和服务器的数据进行加密和解密,但我无法得到相同的结果,从客户机到服务器的数据不会被解密,同样在对来自服务器的相同数据进行加密时,我从客户端的加密中得到了一个独特的结果 客户机是使用Crypto++用C++编写的。守则:C# C++;(加密和加密)和C加密匹配,c#,c++,asp.net-core,encryption,crypto++,C#,C++,Asp.net Core,Encryption,Crypto++,为了客户机和服务器之间的安全通信,我想对来自客户机和服务器的数据进行加密和解密,但我无法得到相同的结果,从客户机到服务器的数据不会被解密,同样在对来自服务器的相同数据进行加密时,我从客户端的加密中得到了一个独特的结果 客户机是使用Crypto++用C++编写的。守则: string data = "teststring,teststring,teststring"; string encryptedData = client.encrypt(userData, "0
string data = "teststring,teststring,teststring";
string encryptedData = client.encrypt(userData, "01234567891234560123456789123456", "0123456789123456");
代码的服务器端是用C#(ASP.NET Core 3.1)编写的:
输出:
data: "teststring,teststring,teststring"
encryptedData: "tIDlWnnzOQWh5HIvRDJya6z7jOglkIlYrICeYW9RoEM="
我无法同时从客户端和服务器解密数据。请帮助我。 < P>发布的C++代码很好。它返回在我的机器上发布的密文
STpu…0lWJ
,可以使用decrypt()
方法对密文进行解密
相反,尽管发布的C#code返回发布的密文tIDl…RoEM=
,但无法使用Decrypt()
方法对密文进行解密。这有两个原因:
- 在
和Encrypt()
方法中使用了不同的密钥。<代码>解密()/Cux>方法的关键与C++代码中应用的密钥匹配。关于两种代码密文的比较,应更换Decrypt()
方法中的密钥Encrypt()
- 密文在
方法中是Base64编码的,但在Encrypt()
方法中不是Base64解码的(而是ASCII编码的)。这里必须在Decrypt()
方法中执行Base64解码(注意Decrypt()
方法中的ASCII解码不是替代方法,因为这会损坏密文)Encrypt()
如果这两个bug是固定的,则C++和C代码的密文除了结尾之外匹配。最后一个不匹配是由不同的填充物造成的。在C++代码中使用pkCS7填充,在C代码中零填充。如果C代码中的填充(在
Encrypt()
和Decrypt()
方法中)更改为PaddingMode.PKCS7
,则密文匹配
C代码中的其他问题包括:
- 在
方法Encrypt()
Encoding.Default中使用
方法Decrypt()
。此处应采用一致的编码,例如Encoding.ASCII
编码.UTF8
- 指定的128位密钥大小与使用的256位密钥不一致。这没有效果,因为显式密钥规范会自动更正密钥大小(但是,应正确指定密钥大小或完全忽略密钥大小)
另外,应该注意的是,静态IV是不安全的(当然,出于测试目的,这是可以的)。不管加密数据在一瞬间是如何显示的。问:你得到同样的明文吗?您是否能够在C++中加密(不管加密的数据是什么样子),并用C++成功地解密预期的明文?在C++中,你能加密C++并解密预期的明文吗?@ PaulSM4没有。我无法从服务器上的客户端解密数据,反之亦然。这就是问题所在。
data: "teststring,teststring,teststring"
encryptedData: "STpuD/dRgYard+Yqpdd5KOYET7607i7ZRUoKm5eshHzR3ErafaxgZ2+T1tSp0lWJ"
public static string Encrypt(string input)
{
byte[] clearBytes = Encoding.Default.GetBytes(input);
using (Aes encryptor = Aes.Create("AES"))
{
// encryptor.BlockSize = 32;
encryptor.Padding = PaddingMode.Zeros;
encryptor.KeySize = 128;
encryptor.Mode = CipherMode.CBC;
encryptor.Key = Encoding.Default.GetBytes("01286567891233460123456789123456");
encryptor.IV = Encoding.Default.GetBytes("0123456789123456");
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
byte[] bt = ms.ToArray();
input = Convert.ToBase64String(bt);
}
}
return input;
}
public static string Decrypt(string input)
{
byte[] clearBytes = Encoding.ASCII.GetBytes(input);
using (Aes decryptor = Aes.Create("AES"))
{
//decryptor.BlockSize = 32;
decryptor.Padding = PaddingMode.Zeros;
decryptor.KeySize = 128;
decryptor.Mode = CipherMode.CBC;
decryptor.Key = Encoding.ASCII.GetBytes("01234567891234560123456789123456");
decryptor.IV = Encoding.ASCII.GetBytes("0123456789123456");
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, decryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
byte[] bt = ms.ToArray();
input = Encoding.ASCII.GetString(bt);
}
}
return input;
}
data: "teststring,teststring,teststring"
encryptedData: "tIDlWnnzOQWh5HIvRDJya6z7jOglkIlYrICeYW9RoEM="