Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# C++;(加密和加密)和C加密匹配_C#_C++_Asp.net Core_Encryption_Crypto++ - Fatal编程技术网

C# C++;(加密和加密)和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

为了客户机和服务器之间的安全通信,我想对来自客户机和服务器的数据进行加密和解密,但我无法得到相同的结果,从客户机到服务器的数据不会被解密,同样在对来自服务器的相同数据进行加密时,我从客户端的加密中得到了一个独特的结果

客户机是使用Crypto++用C++编写的。守则:

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()
    Decrypt()
    方法中使用了不同的密钥。<代码>解密()/Cux>方法的关键与C++代码中应用的密钥匹配。关于两种代码密文的比较,应更换
    Encrypt()
    方法中的密钥
  • 密文在
    Encrypt()
    方法中是Base64编码的,但在
    Decrypt()
    方法中不是Base64解码的(而是ASCII编码的)。这里必须在
    Decrypt()
    方法中执行Base64解码(注意
    Encrypt()
    方法中的ASCII解码不是替代方法,因为这会损坏密文)

如果这两个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="