我将经典的ASP应用程序转换为C#,并希望能够解密最初在经典ASP中加密的C#中的字符串。经典的ASP代码在这里,而C#代码在这里。我面临的问题是,asp和C#中的Encrypt和Decrypt方法的签名不同。这是我用于解密的asp代码,其中包装了解密代码。
Function AESDecrypt(sCypher)
if sCypher <> "" then
Dim bytIn()
Dim bytOut
Dim bytPassword()
Dim lCount
Dim lLength
Dim sTemp
Dim sPassword
sPassword = "My_Password"
lLength = Len(sCypher)
ReDim bytIn(lLength/2-1)
For lCount = 0 To lLength/2-1
bytIn(lCount) = CByte("&H" & Mid(sCypher,lCount*2+1,2))
Next
lLength = Len(sPassword)
ReDim bytPassword(lLength-1)
For lCount = 1 To lLength
bytPassword(lCount-1) = CByte(AscB(Mid(sPassword,lCount,1)))
Next
bytOut = DecryptData(bytIn, bytPassword) //' this is the problem child
lLength = UBound(bytOut) + 1
sTemp = ""
For lCount = 0 To lLength - 1
sTemp = sTemp & Chr(bytOut(lCount))
Next
AESDecrypt = sTemp
End if
End Function
但是,在c#中,我正在努力转换此函数,因为等效于DecryptData的c#具有更多参数
public static byte[] DecryptData(byte[] message, byte[] password,
byte[] initialisationVector, BlockSize blockSize,
KeySize keySize, EncryptionMode cryptMode)
{...}
我可以为InitializationVector,blockSize,keySize,cryptMode使用什么值,以便能够像传统的ASP代码一样解密。
使用Phil Fresle的C#Rijndael实现,您可以使用以下代码成功解密使用Phil的ASP / VBScript版本加密的值。
您可以在此处阅读有关加密的答案:经典ASP和ASP.NET之间的密码加密/解密
public string DecryptData(string encryptedMessage, string password)
{
if (encryptedMessage.Length % 2 == 1)
throw new Exception("The binary key cannot have an odd number of digits");
byte[] byteArr = new byte[encryptedMessage.Length / 2];
for (int index = 0; index < byteArr.Length; index++)
{
string byteValue = encryptedMessage.Substring(index * 2, 2);
byteArr[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
}
byte[] result = Rijndael.DecryptData(
byteArr,
Encoding.ASCII.GetBytes(password),
new byte[] { }, // Initialization vector
Rijndael.BlockSize.Block256, // Typically 128 in most implementations
Rijndael.KeySize.Key256,
Rijndael.EncryptionMode.ModeECB // Rijndael.EncryptionMode.ModeCBC
);
return ASCIIEncoding.ASCII.GetString(result);
}
多数默认实现将使用的密钥大小128,192,或256位。128位的块大小是标准的。尽管某些实现允许使用128位以外的其他块大小,但更改块大小只会在尝试将一种实现中的数据加密以在另一种实现中正确解密时将另一项添加到混合中,从而引起混乱。
原来我错了一件东西。对EncryptionMode
应设置为EncryptionMode.ModeECB
,不是EncryptionMode.ModeCBC
。“ ECB”的安全性较低(https://crypto.stackexchange.com/questions/225/should-i-use-ecb-or-cbc-encryption-mode-for-my-block-cipher),因为它没有循环像CBC一样,但这就是在VB版本的加密中实现的方式。
有趣的是,在ECB加密值上使用CBC将对头几个字节起作用,直到某个点(我想这与块大小有关)为止,在那一点上该值的其余部分被破坏了。在VB版本中加密长字符串并用我上面发布的代码以以下方式解密时,您可以特别清楚地看到这一点:EncryptionMode.ModeECB
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句