首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AesCryptoServiceProvider抛出密码异常

AesCryptoServiceProvider抛出密码异常
EN

Stack Overflow用户
提问于 2014-11-30 09:33:48
回答 2查看 270关注 0票数 0

我正在为学校做一些项目。我正在与TcpClient和TcpListener进行服务器客户端通信。开始时,我在服务器上创建AES密钥,然后使用RSA将其发送到客户端。我在这里没什么问题。但是,当我试图在客户机上加密字符串,然后在服务器上加密它时,我会得到一个异常。

  1. 填充无效,无法移除。

服务器代码:

代码语言:javascript
复制
Byte[] bytes = new Byte[1024];
String data = null;
clientStream.Read(bytes, 0, bytes.Length); // preberemo iz streama
//Array.Clear(bytes, 0, bytes.Length);
// string temp = Encoding.UTF8.GetString(bytes11);
//temp = temp.Replace("\0", "");
//yte[] bytes = Encoding.UTF8.GetBytes(temp);
using (MemoryStream msEncrypt = new MemoryStream())
{

    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateDecryptor(aes.Key,aes.IV), CryptoStreamMode.Write))
    {

        //StreamWriter swEncrypt = new StreamWriter(csEncrypt);

        csEncrypt.Write(bytes, 0, bytes.Length);


    }
    byte[] encrypted = msEncrypt.ToArray();
    string enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
}

客户代码:

代码语言:javascript
复制
byte[] messg = Encoding.UTF8.GetBytes(messig);
// dobimo client stream
string enc = null;
using (MemoryStream msEncrypt = new MemoryStream())
{


    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write))
    {

        csEncrypt.Write(messg,0,messg.Length);
    }
    byte[] encrypted = msEncrypt.ToArray();
    enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
}
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes(enc);
//CryptoStream CryptStream = new CryptoStream(stream,aes.CreateEncryptor(aes.Key, aes.IV),CryptoStreamMode.Write);


stream.Write(data, 0, data.Length); // pošljem sporočilo

在试图使用msEncrypt.ToArray()时,服务器上会出现异常;

但是,如果我以二进制方式分配Byte[],或者删除所有null值,就会得到一个异常,上面写着“输入数据不是一个完整的块”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-30 10:13:37

我用以下方法解决了这个问题:

代码语言:javascript
复制
aes.Padding = PaddingMode.Zeros;
票数 0
EN

Stack Overflow用户

发布于 2014-11-30 14:27:20

问题很可能是Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);。这意味着代码将具有任何值的字节视为文本编码。这意味着,如果字节不代表有效的文本,那么它们要么会更改值(例如,用问号替换),要么将所有内容一起删除。

需要使用基64编码将密文作为实际文本来处理。在当今时代,密文总是二进制的(通常按字节分组)。

请注意,使用PaddingMode.Zeros并不能解决问题。如果使用UTF-8解码,可能会从密文中删除信息。PaddingMode.Zeros只删除异常,并不能解决信息丢失的根本问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27211859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档