数据解密问题[英] Data decryption issue

问题描述

我正在尝试处理一些加密/解密例程
我的数据,虽然加密效果很好,但我一直遇到
消息"填充无效,无法删除"关于解密片.
从我所看到的一切来看,我在这里做的事情是正确的 我的代码是
如下:

private const string PassStr = "MyPrivateKey";
private static readonly byte[] PassSalt = new byte[] { Byte Byte
字节字节字节};
私有静态只读启用en;

静态加密()
{
zh = new Enabled();
en.enabled = true;
}

私有静态字节[] TransDown(char[] TransString)
{
byte[] ResultStr = new byte[TransString.Length];

for (int i = 0; i < TransString.Length; i++)
ResultStr[i] = Convert.ToByte(TransString[i]);

返回 ResultStr;
}

私有静态 char[] TransUp(Byte[] TransString)
{
char[] ResultStr = new char[TransString.Length];

for (int i = 0; i < TransString.Length; i++)
ResultStr[i] = Convert.ToChar(TransString[i]);

返回 ResultStr;
}

私有静态字符[] TransDown(String TransString)
{
char[] ResultStr = new char[TransString.Length];

for (int i = 0; i < TransString.Length; i++)
ResultStr[i] = Convert.ToChar(TransString[i]);

返回 ResultStr;
}

public static char[] Encrypt(char[] InputString)
{
if (en.enabled)
{
if ((InputString != null) && (InputString.Length 0))
{
char[] ResultStr = new char[32];
内存流内存流;
CryptoStream 加密流;
RijndaelManaged rijndael = new RijndaelManaged();
ResultStr = TransDown(PassStr);
rijndael.Key = TransDown(ResultStr);
rijndael.IV = PassSalt;
rijndael.Padding = PaddingMode.PKCS7;
rijndael.Mode = CipherMode.CBC;
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream,
rijndael.CreateEncryptor(), CryptoStreamMode.Write);
cryptoStream.Write(TransDown(InputString), 0,
InputString.Length);
cryptoStream.FlushFinalBlock();
//ResultStr = TransUp(memoryStream.ToArray());
cryptoStream.Close();
返回 TransUp(memoryStream.ToArray());
}
其他
返回TransDown("NULL");
}
其他
return TransDown("未授权");
}

public static char[] Decrypt(char[] InputString)
{
if (en.enabled)
{
if ((InputString != null) && (InputString.Length 0))
{
char[] ResultStr = new char[32];
byte[] ResultByte = new byte[InputString.Length];
MemoryStream memoryStream = 新
MemoryStream(TransDown(InputString));
memoryStream.Position = 0;
CryptoStream 加密流;
RijndaelManaged rijndael = new RijndaelManaged();
ResultStr = TransDown(PassStr);
rijndael.Key = TransDown(ResultStr);
rijndael.IV = PassSalt;
rijndael.Padding = PaddingMode.PKCS7;
rijndael.Mode = CipherMode.CBC;
cryptoStream = new CryptoStream(memoryStream,
rijndael.CreateDecryptor(), CryptoStreamMode.Read);
cryptoStream.Read(ResultByte, 0, InputString.Length);
cryptoStream.Close();
返回 TransUp(ResultByte);
}
其他
返回TransDown("");
}
其他
return TransDown("未授权");
}

我得到的消息是:

消息 6522,第 16 级,状态 2,第 1 行
执行用户定义的例程或
期间发生 .NET Framework 错误聚合''解密'':
System.Security.Cryptography.CryptographicExceptio n:填充无效并且
无法删除.
System.Security.Cryptography.CryptographicException:
在 System.Security.Cryptography.RijndaelManagedTransf orm.DecryptData(Byte[]
inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]&输出缓冲区,
Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)

System.Security.Cryptography.RijndaelManagedTransf orm.TransformFinalBlock(Byte[]
inputBuffer, Int32 inputOffset, Int32 inputCount)
在 System.Security.Cryptography.CryptoStream.Read(字节 [] 缓冲区,Int32
偏移量,Int32 计数)
在 SQLEncryption.Encryption.Decrypt(Char[] InputString)

谁能告诉我哪里出错了?我不懂密码学
组件足够好,可以知道我做错了什么.谢谢.

推荐答案

2008 年 8 月 1 日星期五 15:33:10 -0700,Tom Andrecht
<to**********@nospam.dmacorporation.com 写道:
我正在尝试处理一些加密/解密例程

我的数据,虽然加密效果很好,但我一直遇到

消息"填充无效,无法删除"关于解密
一块.
从我所看到的一切来看,我在这里做的事情是正确的 我的代码是
作为
如下:
恕我直言,我不明白如果你不能成功解密
数据,您可以断言"加密运行良好".不是吗
可能你的解密是正确的,但是因为加密是
错了,解密步骤还是失败?:)

无论如何,我不是你正在做的这种加密/解密方面的专家.但是
我确实注意到您似乎在互换使用字节和字符,
这通常是一个坏主意.据我所知,你的转化率
在这种情况下做是有效的,但我可以告诉你,在许多情况下
他们不会的.它们也可能在这里无效(在
您发布的代码的至少一部分,对我来说似乎很可能).

而不是你的"TransUp"和"TransDown"方法,你可能想
考虑使用编码提供的字符到字节的转换
班级.这将允许您在
之间进行可靠的往返转换定义 .NET 字符串和实际字节的 Unicode 字符.

Pete

不幸的是我尝试了内置的转换例程,但无法获得它们
去工作.也许我在 Delphi 待得太久了,无法理解这一点
东西又出来了.就加密例程而言,我知道它有效
因为我一次可以成功解密一条记录.问题
当我尝试解密多个记录时(传入
来自 MSSQL).前一两个效果很好,然后我就搞砸了.是
我需要做些什么来删除额外的填充?没看过
到目前为止都这样.

汤姆

"彼得·杜尼霍"<Np*********@nnowslpianmk.com 在留言中写道
新闻:op***************@petes-computer.local...
2008 年 8 月 1 日星期五 15:33:10 -0700,Tom Andrecht
<to**********@nospam.dmacorporation.com 写道:
>我正在尝试使用一些加密/解密例程来处理

我的数据,虽然加密效果很好,但我一直遇到

消息"填充无效,无法删除";关于解密
一块.
从我所看到的一切来看,我在这里做的事情是正确的 我的代码是
as
如下:

恕我直言,我不明白如果你不能成功解密
数据,您可以断言"加密运行良好".不是吗
可能你的解密是正确的,但是因为加密是
错了,解密步骤还是失败?:)

无论如何,我不是你正在做的这种加密/解密方面的专家.但是
我确实注意到您似乎在互换使用字节和字符,
这通常是一个坏主意.据我所知,你的转化率
在这种情况下做是有效的,但我可以告诉你,在许多情况下
他们不会的.它们也可能在这里无效(在
您发布的代码的至少一部分,对我来说似乎很可能).

而不是你的"TransUp"和"TransDown"方法,你可能想
考虑使用编码提供的字符到字节的转换
班级.这将允许您在
之间进行可靠的往返转换定义 .NET 字符串和实际字节的 Unicode 字符.

皮特


2008 年 8 月 1 日星期五 16:04:45 -0700,Tom Andrecht
<to**********@nospam.dmacorporation.com 写道:
不幸的是,我尝试了内置的转换例程,但无法获得
他们
去工作.
我恭敬地建议你再试一次.他们实际上并不那么难
使用(它们与您使用的专用方法基本相同
写的,除了他们正确地进行了转换).如果你有
关于它们的使用的具体问题,请随时发布那些
问题在这里.我们当中肯定会有人可以提供帮助.
也许我在 Delphi 待得太久了,无法理解这一点
东西又出来了.就加密例程而言,我知道它有效
因为我一次可以成功解密一条记录.
问题
当我尝试解密多条记录时发挥作用(通过

来自 MSSQL).
这并没有告诉您加密有效.它只告诉你
当您只有一条记录时,加密和解密都可以工作.
因为它们都只处理一条记录,并且因为_something_失败了
当你有多个记录时,你仍然不知道它是否是
加密、解密或两者都有缺陷的"不止一个
记录"

至于到底有什么问题,我会指出,因为你的代码
张贴不是一个简洁但完整的代码示例,尤其是
没有在"多条记录"中演示你是如何使用它的
在这种情况下,可能根本无法解释你做错了什么.

如果你能发布一个真正简洁但完整的东西会更好
可靠地演示您遇到的问题的代码示例.

皮特

本文地址:https://www.itbaoku.cn/post/1050713.html