首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TripleDES解密问题

TripleDES解密问题
EN

Stack Overflow用户
提问于 2013-09-23 09:29:57
回答 1查看 623关注 0票数 0

我使用Visual Basic中的以下函数用3des对字符串"Test“进行了解码:

代码语言:javascript
复制
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

我使用下面的函数调用它

代码语言:javascript
复制
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作为我的输入,正如我所预期的那样。

代码语言:javascript
复制
function decrypt($content){
$key = "MyKeygoeshere12345678901";
$iv = "Heretheiv";
return  mcrypt_cbc(MCRYPT_3DES, $key,  base64_decode($content), MCRYPT_DECRYPT, $iv);
}

有人能告诉我我哪里做错了吗?

EN

回答 1

Stack Overflow用户

发布于 2013-09-23 10:12:16

有几件事:

  1. Use MCRYPT_TripleDES cypher instead.
  2. Generate a valid IV.

您还应该包括如何生成加密值。

无论如何,这里有一个工作示例,您可以在您认为合适的时候使用。

代码语言:javascript
复制
<?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>';
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18950576

复制
相关文章

相似问题

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