Phil Fresle将VB6 AES Rijndael分组密码转换为C#

Phil Fresle将VB6 AES Rijndael分组密码转换为C#,c#,encryption,vbscript,asp-classic,C#,Encryption,Vbscript,Asp Classic,我正在将一个经典asp应用程序转换为C#,并希望能够解密C#中最初在经典asp中加密的字符串。经典的asp代码是,c代码是。我面临的问题是asp和C#中加密和解密方法的签名不同。这是我的asp解密代码,它封装了解密代码 Function AESDecrypt(sCypher) if sCypher <> "" then Dim bytIn() Dim bytOut Dim bytPassword() Dim lCount Dim lLeng

我正在将一个经典asp应用程序转换为C#,并希望能够解密C#中最初在经典asp中加密的字符串。经典的asp代码是,c代码是。我面临的问题是asp和C#中加密和解密方法的签名不同。这是我的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
我可以使用哪些值来初始化AsionVector、blockSize、keySize、cryptMode,以便能够以与经典asp代码相同的方式进行解密。

使用Phil Fresle的C#Rijndael实现,您可以使用以下代码成功解密使用Phil的asp/VBScript版本加密的值

您可以在此处阅读我关于加密的回答:

公共字符串解密数据(字符串加密消息、字符串密码)
{
如果(encryptedMessage.Length%2==1)
抛出新异常(“二进制键不能有奇数位数”);
byte[]byteArr=新字节[encryptedMessage.Length/2];
for(int index=0;index
大多数默认实现将使用128192256位的密钥大小。128位的块大小是标准的。尽管某些实现允许块大小不是128位,但更改块大小只会在混合中添加另一项,从而在尝试在一个实现中加密数据以在另一个实现中正确解密时造成混乱

更新 事实证明,我在这一点上是错的;
EncryptionMode
应设置为
EncryptionMode.ModeECB
,而不是
EncryptionMode.ModeCBC
。“ECB”不太安全(),因为它不像CBC那样循环,但在VB版本的加密中就是这样实现的


有趣的是,在ECB加密值上使用CBC将在前几个字节内有效,直到某一点(我想这与块大小有关),此时值的剩余部分被破坏。在VB版本中加密一个长字符串并使用我上面发布的代码以
EncryptionMode.ModeECB

模式对其进行解密时,您可以特别清楚地看到这一点,这完全取决于
DecryptData()
的功能。但是,您可能正在使用ECB,这是不安全的。thanx,DecryptData在经典的asp和c版本的代码中都有,我可以将其粘贴到这里,但这是一段相当长的代码,可以在我发布的链接中找到。我最大的挑战是DecryptData函数具有不同的签名,但它来自同一作者。我想从经典asp迁移到c#,并想慢慢地淘汰asp代码,因此加密必须在c中产生与在asp中相同的结果。因此,您要求我们告诉您函数使用的模式,而不向我们显示函数?在这里找到加密解决方案,看起来像VBScript,而不是VB6。
public static byte[] DecryptData(byte[] message, byte[] password, 
            byte[] initialisationVector, BlockSize blockSize, 
            KeySize keySize, EncryptionMode cryptMode)
        {...}
    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);
    }