TripleDES Проблемы с расшифровкой
Я расшифровал строку "Test" с помощью 3des, используя следующие функции в Visual Basic:
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
Friend Class cTripleDES
' define the triple des provider
Private m_des As New TripleDESCryptoServiceProvider
' define the string handler
Private m_utf8 As New ASCIIEncoding
' define the local property arrays
Private m_key() As Byte
Private m_iv() As Byte
Public Sub New(ByVal key() As Byte, ByVal iv() As Byte)
Me.m_key = key
Me.m_iv = iv
End Sub
Public Function Encrypt(ByVal input() As Byte) As Byte()
Return Transform(input, m_des.CreateEncryptor(m_key, m_iv))
End Function
Public Function Decrypt(ByVal input() As Byte) As Byte()
Return Transform(input, m_des.CreateDecryptor(m_key, m_iv))
End Function
Public Function Encrypt(ByVal text As String) As String
Dim input() As Byte = m_utf8.GetBytes(text)
Dim output() As Byte = Transform(input, _
m_des.CreateEncryptor(m_key, m_iv))
Return Convert.ToBase64String(output)
End Function
Public Function Decrypt(ByVal text As String) As String
Dim input() As Byte = Convert.FromBase64String(text)
Dim output() As Byte = Transform(input, _
m_des.CreateDecryptor(m_key, m_iv))
Return m_utf8.GetString(output)
End Function
Private Function Transform(ByVal input() As Byte, _
ByVal CryptoTransform As ICryptoTransform) As Byte()
' create the necessary streams
Dim memStream As MemoryStream = New MemoryStream
Dim cryptStream As CryptoStream = New _
CryptoStream(memStream, CryptoTransform, _
CryptoStreamMode.Write)
' transform the bytes as requested
cryptStream.Write(input, 0, input.Length)
cryptStream.FlushFinalBlock()
' Read the memory stream and convert it back into byte array
memStream.Position = 0
Dim result(CType(memStream.Length - 1, System.Int32)) As Byte
memStream.Read(result, 0, CType(result.Length, System.Int32))
' close and release the streams
memStream.Close()
cryptStream.Close()
' hand back the encrypted buffer
Return result
End Function
Я позвонил с помощью этой функции
Imports System.Security.Cryptography
Imports System.IO
Imports System.Text
Module tripledes
Function Encrypt(ByVal text As String) As String
' define the local key and vector byte arrays
Dim key() As Byte = Encoding.ASCII.GetBytes("MyKeygoeshere12345678901")
Dim iv() As Byte = Encoding.ASCII.GetBytes("Heretheiv")
' instantiate the class with the arrays
Dim des As New cTripleDES(key, iv)
' the value of decryptedData should be "test",
' but for our example purposes, let's re-encrypt it
Return des.Encrypt(text)
End Function
Function Decrypt(ByVal text As String) As String
' define the local key and vector byte arrays
Dim key() As Byte = Encoding.ASCII.GetBytes("MyKeygoeshere12345678901")
Dim iv() As Byte = Encoding.ASCII.GetBytes("Heretheiv")
' instantiate the class with the arrays
Dim des As New cTripleDES(key, iv)
' the value of decryptedData should be "test",
' but for our example purposes, let's re-encrypt it
Return des.Decrypt(text)
End Function
End Module
Но если я попытаюсь расшифровать его с помощью следующей функции PHP, вывод будет agkk, а не Test as Input и, как я исключил.
function decrypt($content){
$key = "MyKeygoeshere12345678901";
$iv = "Heretheiv";
return mcrypt_cbc(MCRYPT_3DES, $key, base64_decode($content), MCRYPT_DECRYPT, $iv);
}
Может кто-нибудь сказать мне, что я делаю не так?
1 ответ
Пара вещей:
- Вместо этого используйте шифр MCRYPT_TripleDES.
- Создайте действительный IV.
Вы должны также указать, как генерируется зашифрованное значение.
Несмотря на это, вот рабочий пример, который вы можете использовать по своему усмотрению.
<?php
$content = "your_secret_string";
$secret = "your_secret_key";
$iv = mcrypt_create_iv(mcrypt_get_block_size(MCRYPT_TripleDES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);
function encrypt($iv, $content, $secret)
{
return base64_encode(mcrypt_cbc(MCRYPT_TripleDES, $secret, $content, MCRYPT_ENCRYPT, $iv));
}
function decrypt($iv, $content, $secret)
{
return mcrypt_cbc(MCRYPT_TripleDES, $secret, base64_decode($content), MCRYPT_DECRYPT, $iv);
}
$encrypted = encrypt($iv, $content, $secret);
echo 'Encrypted: '. encrypt($iv, $content, $secret) . '<br>';;
echo 'Decrypted: '. decrypt($iv, $encrypted, $secret) . '<br>';