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

我将经典的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代码一样解密。

瑞安·格里菲斯(Ryan Griffith)

使用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);
    }

多数默认实现将使用的密钥大小128192,或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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Python转换为VB6

来自分类Dev

将AES解密从PHP转换为C#

来自分类Dev

将VB6字符转换为C#字符串

来自分类Dev

将代码从vb6转换为c#中的代码

来自分类Dev

使用RtlMoveMemory将VB6转换为C#

来自分类Dev

从VB6转换为C#的Chr

来自分类Dev

使用AES /十六进制将ColdFusion加密转换为C#

来自分类Dev

将Python AES转换为Node

来自分类Dev

将 AES 加密 java 转换为 Python

来自分类Dev

将密码查询转换为C#

来自分类Dev

将密码查询转换为C#

来自分类Dev

当出现错误消息“填充无效且无法删除”时,如何将C ++ Rijndael密码术转换为C#?

来自分类Dev

AES CryptoSwift密码后如何将字节转换为NSString

来自分类Dev

如何将DLL函数调用/ DllImport从vb6转换为C#.NET

来自分类Dev

将vb6代码转换为vb.net?

来自分类Dev

在vb6中将Excel数据转换为数据网格视图

来自分类Dev

将VB6 Scripting.Dictionary转换为.NET通用词典

来自分类Dev

是否可以使用 VB6 将 Database Access 97 转换为 Access 2003?

来自分类Dev

将字符串转换为aes_string的美感

来自分类Dev

将String转换为AES的128位密钥

来自分类Dev

将.net aes256加密代码转换为php

来自分类Dev

如何在C#中将vb6'vbFromUnicode'转换为字符串

来自分类Dev

C#十进制转换为VB6货币

来自分类Dev

从VB6转换为C#字符串操作

来自分类Dev

在C#中将Aes.Key转换为SecureString

来自分类Dev

是否可以将C#等待与以前的旧VB6 DoEvent相比较?

来自分类Dev

Rijndael的AES OFB加密

来自分类Dev

AES(rijndael)解密

来自分类Dev

将C#AES加密算法转换为Python3