首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vb6和c#中的AES加密技术

vb6和c#中的AES加密技术
EN

Stack Overflow用户
提问于 2013-01-09 00:35:22
回答 2查看 5.5K关注 0票数 4

我需要一个.NET (理想情况下是C#)算法,它将产生与我用来加密和decrypt二进制文件的vb6算法相同的结果。一个星期以来,我一直在寻找代码,但没有取得什么成功。

我从如何在VB6解密VB.NET中加密字符串开始,但它只是一半的解决方案,它使用的是RC2而不是AES。经过一些修改之后,我让我的vb6代码在AES中工作,但是我找不到一种方法让c#产生同样的结果。我认为这与我制作KeyIV的方式有关。我一直在研究密码服务,我的尝试可以分为两种基本类型。在这里,我尝试了PasswordDeriveBytes.CryptDeriveKey,并试图使它与aes一起工作。根本没有成功。试着模仿它的行为。贝娄,我将发布我的vb6代码和我最近的c#尝试。我不能100%肯定地说vb6是完美的,所以如果需要在那里进行更改,我是开放的。我知道有一种使用p调用的方法,我知道有一种方法可以让.net dll从我的vb apps中调用。我不想走那条路。

VB6函数

代码语言:javascript
复制
Public Function Crypt_File(PathToSourceFile As String, PathToDestFile As String, Password As String, HowTo As CryptMethod) As Boolean
Const FName As String = "mdlCryptography.Encrypt_file"
Dim CryptoContext As Long
Dim strProvider As String
Dim HashHnd As Long
Dim CrypKey As Long
Dim Step As Integer
Dim CryptBuff As String
Dim InFileNum As Long, OutFileNum As Long
Dim BytesRemaining As Long, CurrentBufferSize  As Long
Dim MAX_BUFFER_SIZE As Long
Dim DoCryptFinalise As Long
Dim Buff As String
On Error GoTo Trap:
    Step = 10
    Crypt_File = False
    If PathToSourceFile = PathToDestFile Then '
        Err.Raise 334, FName, "Sourse and Dest Path are the same"
    End If
    MAX_BUFFER_SIZE = (2 ^ 20) * 100 '100 MB
    Buff = vbNullChar
    strProvider = MS_ENH_RSA_AES_PROV_A & vbNullChar
    If Not CBool(CryptAcquireContext(CryptoContext, ByVal Buff, ByVal strProvider, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) Then
        Err.Raise 33410, FName, "Unable to Acquire Context: " & MS_ENH_RSA_AES_PROV_A
    End If

    If Not CBool(CryptCreateHash(CryptoContext, CALG_SHA_256, ByVal 0&, ByVal 0&, HashHnd)) Then
        Err.Raise 33420, FName, "Unable to Create a hash object. " & MS_ENH_RSA_AES_PROV_A
    End If

    If Not CBool(CryptHashData(HashHnd, Password, Len(Password), ByVal 0&)) Then
        Err.Raise 33430, FName, "Unable to Hash password. "
    End If

    If Not CBool(CryptDeriveKey(CryptoContext, CALG_AES_256, HashHnd, ByVal CRYPT_NO_SALT, CrypKey)) Then
        Err.Raise 33440, FName, "Unable to Derive Key. "
    End If
    'Clear HashHnd
    If HashHnd <> 0 Then
        Call CryptDestroyHash(HashHnd)
    End If
    HashHnd = 0

    'Prep Data For encryption
    DoCryptFinalise = 0
    InFileNum = FreeFile
    Step = 20
    Open PathToSourceFile For Binary Access Read As #InFileNum
    If LenB(Dir$(PathToDestFile)) > 0 Then
        Kill PathToDestFile
    End If
    OutFileNum = FreeFile
    Step = 25
    Open PathToDestFile For Binary Access Write As #OutFileNum

    BytesRemaining = LOF(InFileNum)
    'Loop through File Chunks
    Do While BytesRemaining > 0

        If BytesRemaining >= MAX_BUFFER_SIZE Then
            CurrentBufferSize = MAX_BUFFER_SIZE
        Else
            CurrentBufferSize = BytesRemaining
            DoCryptFinalise = 1
        End If

        Buff = String$(CurrentBufferSize, vbNullChar)
        Get #InFileNum, , Buff
            If HowTo = CryptMethod.Encrypt Then
                CryptBuff = EncryptBuffer(CrypKey, DoCryptFinalise, Buff)
            Else
                CryptBuff = DecryptBuffer(CrypKey, DoCryptFinalise, Buff)
            End If
        Put #OutFileNum, , CryptBuff

        BytesRemaining = BytesRemaining - CurrentBufferSize
    Loop
    Close #InFileNum
    Close #OutFileNum
    Crypt_File = True

GoTo Fin
Trap:
    Crypt_File = False
    If Step = 20 Then
        Close #InFileNum
    End If
    If Step = 25 Then
        Close #InFileNum
        Close #OutFileNum
    End If
    Err.Raise Err.Number, Err.source, Err.Description
Fin:

    If CrypKey <> 0 Then
        Call CryptDestroyKey(CrypKey)
    End If
    If HashHnd <> 0 Then
        Call CryptDestroyHash(HashHnd)
    End If
End Function

Private Function EncryptBuffer(CrypKey As Long, DoCryptFinalise As Long, Buff As String) As String
Dim EncDataLength As Long, EnctBuffLen As Long
Dim CryptBuff As String

    EncDataLength = Len(Buff)
    EnctBuffLen = EncDataLength + AES_BLOCK_SIZE
    CryptBuff = String$(EnctBuffLen, vbNullChar)
    LSet CryptBuff = Buff
    If Not CBool(CryptEncrypt(CrypKey, ByVal 0&, ByVal DoCryptFinalise, ByVal 0&, CryptBuff, EncDataLength, EnctBuffLen)) Then
'        Close #InFileNum
'        Close #OutFileNum
        Err.Raise 33450, "mdlCryptography.EncryptBuffer", "Encryption Error"
    End If
    EncryptBuffer = Left$(CryptBuff, EncDataLength)
End Function


Private Function DecryptBuffer(CrypKey As Long, DoCryptFinalise As Long, Buff As String) As String
Dim EncDataLength As Long
Dim CryptBuff As String

    EncDataLength = Len(Buff)
    CryptBuff = String$(EncDataLength, vbNullChar)
    LSet CryptBuff = Buff
    If Not CBool(CryptDecrypt(CrypKey, ByVal 0&, ByVal DoCryptFinalise, ByVal 0&, CryptBuff, EncDataLength)) Then
'        Close #InFileNum
'        Close #OutFileNum
        Err.Raise 33450, "mdlCryptography.DecryptBuffer", "Decryption Error"
    End If
    DecryptBuffer = Left$(CryptBuff, EncDataLength)
End Function

c#,这是非常不雅致的

代码语言:javascript
复制
private void Crypt(bool DoEn)
{
    int Rfc2898KeygenIterations = 100;
    int AesKeySizeInBits = 128;
    byte[] rawPlaintext ;//= System.Text.Encoding.Unicode.GetBytes("This is all clear now!");
    byte[] cipherText = null;
    byte[] plainText = null;

    using (Aes aes = new AesManaged())
    {

        int KeyStrengthInBytes = aes.KeySize / 8;

        SHA256 MySHA = new SHA256Cng();
        MySHA.Initialize();
        plainText = Encoding.ASCII.GetBytes(txtPassword.Text);
        aes.Key = MySHA.ComputeHash(plainText );
        aes.IV =  Encoding.ASCII.GetBytes("0000000000000000");
        if (DoEn)
        {
            //using (FileStream fs = new FileStream(txtOut.Text,FileMode.CreateNew ))
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    //using (StreamReader myFile = new StreamReader(txtIn.Text))
                    //{
                    //    rawPlaintext = System.Text.Encoding.ASCII.GetBytes(myFile.ReadToEnd());
                        rawPlaintext = File.ReadAllBytes(txtIn.Text);
                        cs.Write(rawPlaintext, 0, rawPlaintext.Length);

                    //}
                }
                cipherText = ms.ToArray();
                File.WriteAllBytes(txtOut.Text, cipherText);
            }
        }
        else
        {
            //using (FileStream fs = new FileStream(txtIn.Text, FileMode.CreateNew))
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    //using (StreamReader myFile = new StreamReader(txtOut.Text))
                    //{
                        //string s = myFile.r.ReadToEnd();
                        rawPlaintext = File.ReadAllBytes(txtOut.Text); //System.Text.Encoding.ASCII.GetBytes(s);
                        //cipherText = new int[rawPlaintext.Length];
                        cs.Write(rawPlaintext, 0, rawPlaintext.Length);
                        //cs.Write(cipherText, 0, cipherText.Length);
                    //}
                }
                cipherText = ms.ToArray();
                File.WriteAllBytes(txtIn.Text, cipherText);
            }
        }
    }
    //string s = System.Text.Encoding.ASCII.GetString(plainText);
    //Console.WriteLine(s);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-09 04:04:59

在我看来,在VB6示例中,您指定的是CRYPT_NO_SALT,我认为这将导致使用无初始化向量。这大概都是零但我不确定。

但是,在C#代码中,您将获得ASCII文本"0000000000000000“的字节,这与数字0的字节数组不一样,因为字符' 0‘等于ASCII中的数字48 (参见:http://www.asciitable.com/)。我认为这可能是你问题的根源。

票数 6
EN

Stack Overflow用户

发布于 2013-01-09 04:09:31

这里的向量将产生与预期不同的结果:

代码语言:javascript
复制
aes.IV = Encoding.ASCII.GetBytes("0000000000000000");

这将返回一个由48,而不是0组成的字节数组。

您可以简单地初始化一个字节数组,而不是如下所示:

代码语言:javascript
复制
aes.IV = new byte() {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14226515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档