4

我有 2 个网站:一个是用经典的 asp 编写的,另一个是用 ASP.NET(1.1 框架)编写的。这两个应用程序都使用登录机制来验证基于共享数据库表的用户凭据。到目前为止,密码存储在单向 MD5 哈希中,这意味着如果人们丢失了旧密码,则必须为他们提供一个新生成的密码。我现在想更改它并使密码可解密。

我发现这个 Rijndael 代码与经典 asp 一起使用: http ://www.frez.co.uk/freecode.htm#rijndael

但我无法为 ASP.NET 找到相同的解决方案。我试过这个,但它在经典的 asp 和 ASP.NET 代码之间给了我不同的加密和解密结果:

        If Not String.IsNullOrEmpty(TextBox1.Text) And Not String.IsNullOrEmpty(TextBox2.Text) Then

        Dim password = TextBox1.Text
        Dim key = TextBox2.Text

        Dim keyGenerator = New Rfc2898DeriveBytes(key, 8)
        Dim r = New RijndaelManaged

        r.Mode = CipherMode.CBC
        r.Padding = PaddingMode.Zeros
        r.BlockSize = 256
        r.KeySize = 256
        r.FeedbackSize = 256

        r.IV = keyGenerator.GetBytes(CType(r.BlockSize / 8, Integer))
        r.Key = keyGenerator.GetBytes(CType(r.KeySize / 8, Integer))

        Dim transform As ICryptoTransform = r.CreateEncryptor()

        Dim encoded As Byte() = Encoding.ASCII.GetBytes(password)
        Dim target As Byte() = transform.TransformFinalBlock(encoded, 0, encoded.Length)

        TextBox3.Text = Encoding.ASCII.GetString(target)

    End If

我认为我在生成密钥或 iv 时做错了,但我找不到解决方案。

4

3 回答 3

5

Phil Fresle 提供了此代码的 C# 版本,可在此处下载:http ://www.frez.co.uk/csharp.aspx 。该实现仍然与经典版本不同,因为它需要初始化向量以及块和密钥大小的参数。

您可以使用此实现来匹配经典版本,如下所示:

// Convert the input values to byte[]'s representing ASCII encoding.
// This is what the classic version does
byte[] dataToEncrypt = ASCIIEncoding.ASCII.GetBytes("Ryno");
byte[] password = ASCIIEncoding.ASCII.GetBytes("Saurus");

// Encrypt the data into an array of types
// Notice the block size is 256 bits and the initialization vector is empty.
byte[] results = Rijndael.EncryptData(
    dataToEncrypt,
    password,
    new byte[] { },  // Initialization vector
    Rijndael.BlockSize.Block256,  // Typically 128 in most implementations
    Rijndael.KeySize.Key256,
    Rijndael.EncryptionMode.ModeEBC 
);

// Convert bytes into a HEX string representation
StringBuilder hex = new StringBuilder(results.Length * 2);
foreach (byte b in results)
    hex.AppendFormat("{0:x2}", b);

// FINAL OUTPUT: This matches output of classic ASP Rijndael encryption
string hexEncodedString= hex.ToString();

大多数默认实现将使用128192256位的密钥大小。128位的块大小是标准的。尽管某些实现允许块大小不是 128 位,但更改块大小只会将另一个项目添加到混合中,从而在尝试在一个实现中加密数据以在另一个实现中正确解密时造成混淆。

希望这会有所帮助。

更新

Phil 的链接不再可用,所以我创建了 2 个要点:

于 2013-02-03T17:09:05.363 回答
0

由于 ASP classic 没有本机散列函数,您可能需要将 MD5 VBScript 代码移植到您的 .NET 语言,或使用通用加密组件,因为您的旧代码存在一些错误。

于 2009-11-05T09:21:13.820 回答
0

我快速浏览了经典的 asp 文件,它没有提到使用的块模式,而您的 .net 代码指定了 CBC 模式和填充。进一步的经典实现状态:

' 2001 年 4 月 3 日:底部添加了用于加密/解密大型数据数组的函数。' 加密之前,数组的整个长度作为前四个 ' 字节插入到结果字节数组的第一个块的前面。

您是否正在使用这些功能,如果您也在加密大小字节。

请放心 .net 加密运行良好,我猜您的问题出在您找到的经典解决方案中。如果我处于你的位置,我会先简化事情,然后用每种方法加密一个块,然后从那里扩展......祝你好运

于 2009-11-06T20:05:10.443 回答