0

Visual Basic の AES 暗号化に問題があります。この PHP コードは私が望んでいることを実行しますが、私が書こうとした Visual Basic コードは常に失敗し、間違った初期化ベクトルに関するメッセージが表示されます。

<?php
function decrypt($data) {
$value = "";
$value = base64_decode($data);
$ivlength = 8;
$iv = substr($value,0, $ivlength);
$value = substr($value,$ivlength,strlen($value)-$ivlength);
$key = 'MyKeygoeshere12345678901';  //Muss wegen der verschlüsselung genau 24 zeichen lang sein.
return preg_replace('/[^A-Za-z0-9öäüÄÖÜ\ \:]/', '',decryptAES($value,$iv,$key));
}

function decryptAES($content,$iv, $key) {

    // Setzt den Verschlüsselungsalgorithmus
    $cp = mcrypt_module_open('tripledes', '', 'cbc', '');

    // Ermittelt die Anzahl der Bits, welche die Schlüssellänge des Keys festlegen
    $ks = mcrypt_enc_get_key_size($cp);

    // Erstellt den Schlüssel, der für die Verschlüsselung genutzt wird
    $key = substr($key, 0, $ks);

    // Initialisiert die Verschlüsselung
    mcrypt_generic_init($cp, $key, $iv);

    // Entschlüsselt die Daten
    $decrypted = mdecrypt_generic($cp, $content);

    // Beendet die Verschlüsselung
    mcrypt_generic_deinit($cp);

    // Schließt das Modul
    mcrypt_module_close($cp);

    return trim($decrypted);

}
?>

それが Visual Basic コードです。

Option Explicit On
Option Strict On

Imports System.Security.Cryptography
Imports System.IO
Imports System.Text

Module AES
    Public initv() As Byte

    Public Function Encrypt(ByVal strData As String) As String
        Try
            Dim rd As New TripleDESCryptoServiceProvider
            Dim strKey As String = "MyKeygoeshere12345678901"
            Dim key() As Byte = Encoding.Default.GetBytes(strKey)

            rd.Key = key
            rd.GenerateIV()

            Dim iv() As Byte = rd.IV
            initv = rd.IV

            Dim ms As New MemoryStream

            ms.Write(iv, 0, iv.Length)

            Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
            Dim data() As Byte = System.Text.Encoding.Default.GetBytes(strData)

            cs.Write(data, 0, data.Length)
            cs.FlushFinalBlock()

            Dim encdata() As Byte = ms.ToArray()
            Encrypt = Convert.ToBase64String(encdata)
            cs.Close()
            rd.Clear()
        Catch err As Exception
            Encrypt = err.Message
        End Try
    End Function
    Public Function Decrypt(ByVal data As String) As String
        Dim aes As New AesCryptoServiceProvider()
        Dim crypted As String = Base64.FromBase64(data)
        Dim strKey As String = "MyKeygoeshere12345678901"
        Dim key() As Byte = Encoding.Default.GetBytes(strKey)
        aes.Padding = PaddingMode.Zeros
        aes.Mode = CipherMode.CBC
        aes.KeySize = 192
        aes.Key = key
        Dim IV As String = crypted.Substring(0, 8)
        Dim ivby() As Byte = Encoding.UTF8.GetBytes(IV)
        Dim tmp As Integer = 0

            IV = crypted.Substring(0, 16)
            ivby = Encoding.UTF8.GetBytes(IV)



        MsgBox(aes.BlockSize)
        aes.IV = ivby
        Dim src As Byte() = Encoding.Default.GetBytes(crypted.Substring(8, crypted.Length() - 8))
        Using dec As ICryptoTransform = aes.CreateDecryptor()
            Dim dest As Byte() = dec.TransformFinalBlock(src, 0, src.Length)
            Return Encoding.Unicode.GetString(dest)
        End Using
    End Function
 End Module

上記の復号化コードの問題点を教えてください。

4

2 に答える 2

2

便宜上、トリプル DES を使用します (私のシステムには AES が含まれていないようで、PHP コードはトリプル DES を使用しています。

Option Explicit On
Option Strict On

Imports System.Security.Cryptography
Imports System.IO
Imports System.Text

Module TDES
    Public initv() As Byte

    Public Function Encrypt(ByVal strData As String) As String
        Try
            Dim rd As New TripleDESCryptoServiceProvider
            Dim strKey As String = "MyKeygoeshere12345678901"
            Dim key() As Byte = Encoding.UTF8.GetBytes(strKey)

            rd.Key = key
            rd.GenerateIV()

            Dim iv() As Byte = rd.IV
            initv = rd.IV

            Dim ms As New MemoryStream

            ms.Write(iv, 0, iv.Length)

            Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
            Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(strData)

            cs.Write(data, 0, data.Length)
            cs.FlushFinalBlock()

            Dim encdata() As Byte = ms.ToArray()
            Encrypt = Convert.ToBase64String(encdata)
            cs.Close()
            rd.Clear()
        Catch err As Exception
            Encrypt = err.Message
        End Try
    End Function

    Public Function Decrypt(ByVal data As String) As String
        Dim aes As New TripleDESCryptoServiceProvider()
        Dim crypted() As Byte = Convert.FromBase64String(data)
        Dim strKey As String = "MyKeygoeshere12345678901"
        Dim key() As Byte = Encoding.UTF8.GetBytes(strKey)
        aes.Padding = PaddingMode.Zeros
        aes.Mode = CipherMode.CBC
        aes.KeySize = 192
        aes.Key = key
        Dim ivSize As Integer = aes.BlockSize / 8
        Dim IV(ivSize - 1) As Byte
        Array.Copy(crypted, 0, IV, 0, ivSize)
        aes.IV = IV
        Dim src(crypted.Length - ivSize - 1) As Byte
        Array.Copy(crypted, ivSize, src, 0, src.Length)
        Using dec As ICryptoTransform = aes.CreateDecryptor()
            Dim dest As Byte() = dec.TransformFinalBlock(src, 0, src.Length)
            Return Encoding.UTF8.GetString(dest)
        End Using
    End Function
End Module

に置き換えることができるはずであることに注意してTripleDESCryptoServiceProviderくださいAesCryptoServiceProvider。また、これは base 64 でエンコードされた暗号文を使用するため、PHP コードでも同様に Base 64 エンコードを使用する必要があることに注意してください。

于 2013-09-22T19:23:44.950 に答える