Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php visualbasic与AES初始化向量_Php_Vb.net_Encryption_Cryptography_Aes - Fatal编程技术网

Php visualbasic与AES初始化向量

Php visualbasic与AES初始化向量,php,vb.net,encryption,cryptography,aes,Php,Vb.net,Encryption,Cryptography,Aes,我对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,s

我对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);

}
?>

您能告诉我上面的解密代码有什么问题吗?

首先,IV由字节而不是字符组成,因此您不应该在其上使用字符串函数。此外,IV的大小始终与CBC模式加密中基础密码的块大小相同。由于AES的块大小是16字节,而不是8字节,因此您应该将其替换为16字节,或者在您的情况下替换为
AES.BlockSize/8

首先,IV由字节而不是字符组成,因此您不应该在其上使用字符串函数。此外,IV的大小始终与CBC模式加密中基础密码的块大小相同。由于AES的块大小是16字节,而不是8字节,您应该将其替换为16字节,或者在您的情况下替换为
AES.BlockSize/8

为了方便起见,使用三重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编码。

为了方便起见,请使用TripleDes(我的系统似乎不包含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


请注意,您应该能够用
AesCryptoServiceProvider
替换
TripleDESCryptoServiceProvider
。还请注意,这使用base 64编码的密文,因此您应该在PHP代码中同样使用base 64编码。

在提出问题后,不要对代码进行实质性修改,特别是如果有人已经回答了红色。另外,你不应该要求人们“更正代码”。你可以问出什么问题。我们不是社区调试器。你在那个年龄尝试执行加密和解密很酷。但要学习如何编程加密/解密,你应该亲自尝试。这意味着你有时会陷入困境。在这种情况下,以十六进制表示法打印尽可能多的数据,并尝试找出差异。我正在工作我在这个函数上用了将近两天的时间,我一直在自己尝试它,但现在我不知道该怎么做,因为我的变量ivby总是有不同的长度?!好的,我会一步一步地帮助你。首先,当你对数据进行base64解码时,你希望是
字符串还是
字节[]
?我认为它应该是一个字节,因为它包含不可打印的字符……我说得对吗?在提出问题后不要对代码进行实质性修改,特别是如果有人已经回答了。此外,你不应该要求别人“更正代码”。你可以问出什么问题。我们不是社区调试器。你在那个年龄尝试执行加密和解密很酷。但要学习如何编程加密/解密,你应该亲自尝试。这意味着你有时会陷入困境。在这种情况下,以十六进制表示法打印尽可能多的数据,并尝试找出差异。我正在工作我在这个函数上用了将近两天的时间,我一直在自己尝试它,但现在我不知道该怎么做,因为我的变量ivby总是有不同的长度?!好的,我会一步一步地帮助你。首先,当你对数据进行base64解码时,你希望是
字符串还是
字节[]
?我认为它应该是一个字节,因为它包含不可打印的字符…我说得对吗?哪些字符串函数错误,我必须在哪里写入16?MsgBox输出的aes.Blocksize是128?请帮助我!啊,哦,对不起,我不希望输出以位为单位,将结果除以8…我将修改我的答案。我得到same错误。出于某种原因,ivby的长度是23。我应该发布新代码吗?我必须使用什么来代替字符串函数?哪些字符串函数是错误的,我必须在哪里写入16?MsgBox输出的aes.Blocksize是128?请帮助我!啊,哦,对不起,我没有预料到输出是以位为单位的,将结果除以8。…我将修改我的答案。我得到了相同的错误。出于某种原因,ivby的长度是23。我应该发布新代码吗?我必须使用什么来代替字符串函数?请注意,我必须重新学习basic来回答这个问题。我11岁时开始编写MSX basic,从那以后就再也没有编程过了好吧,永远:)…但我认为三重DES不是很安全,是吗?我几乎自己解决了这个问题,你能看一下“新”吗问题?它不像AES那样安全,但解密起来并不容易。我仍然在我的公司使用TDE,但我们正在尝试将所有内容转换为AES。尝试并移动到AES,看看会发生什么。如上所述,目前您的PHP函数也使用triple-DES,即使它被命名为AES!目前还没有已知的针对triple-DES的实际攻击(除了中间相遇攻击将其强度降低到2^112),但是Triple-DES比AES慢得多,这就是为什么没有理由在新的应用程序中使用Triple-DES的原因。请注意,我必须重新学习basic才能回答这个问题。我11岁时开始编写MSX-basic,从那以后就再也没有对它进行编程了…但我认为三重DES不是很安全,是吗?我几乎自己解决了这个问题,你能看一下“新”吗问题?它不像AES那样安全,但解密起来并不容易。我仍然在我的公司使用TDE,但我们正在尝试将所有内容转换为AES。尝试并移动到AES,看看会发生什么。如上所述,目前您的PHP函数也使用triple-DES,即使它被命名为AES!目前还没有已知的针对triple-DES的实际攻击(除了中间相遇攻击将其强度降低到2^112),但是Triple-DES比AES慢得多,这就是为什么没有理由在新的应用程序中使用Triple-DES的原因。