用于JAVA TripleDES功能的PHP模拟

时间:2014-02-06 09:12:28

标签: java php

我有一个示例Java函数,想为PHP做一个模拟:

public static string Encrypt(string plainText, string key)
    {
        byte[] byteKey = new ASCIIEncoding().GetBytes(key);


        MemoryStream mStream = new MemoryStream();

        // Create a CryptoStream using the MemoryStream 
        // and the passed key and initialization vector (IV).
        CryptoStream cStream = new CryptoStream(mStream,
            new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteKey),
            CryptoStreamMode.Write);

        // Convert the passed string to a byte array.
        byte[] toEncrypt = new ASCIIEncoding().GetBytes(plainText);

        // Write the byte array to the crypto stream and flush it.
        cStream.Write(toEncrypt, 0, toEncrypt.Length);
        cStream.FlushFinalBlock();

        // Get an array of bytes from the 
        // MemoryStream that holds the 
        // encrypted data.
        byte[] ret = mStream.ToArray();

        // Close the streams.
        cStream.Close();
        mStream.Close();

        return Convert.ToBase64String(ret);
    }

这是我的PHP函数,但它没有给我确切的结果:

function Encrypt($data, $secret)
{    
  //Generate a key from a hash
  $key = md5(utf8_encode($secret), true);

  //Take first 8 bytes of $key and append them to the end of $key.
  $key .= substr($key, 0, 8);

  //Pad for PKCS7
  $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  $len = strlen($data);
  $pad = $blockSize - ($len % $blockSize);
  $data .= str_repeat(chr($pad), $pad);

  //Encrypt data
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');

  return base64_encode($encData);

}

我正在尝试加密的字符串是:

Java生成的字符串:i00KAKI7U0L7fyvrEnDdB7DtaJNO1HuwRh0 / J5aWnCQ =
PHP生成的字符串:6065L3jC5Oji8NAVzipA4OZZ102j1zFd / KfLgAdnRX0 =

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

似乎没有以相同的方式使用密码。 在您的Java代码中,您使用IV进行加密,而在PHP代码中却没有这样做。 这是因为ECB,你在PHP代码中指定的模式,不需要任何初始化,而你在Java中使用的模式都是如此。

您使用的是哪个库? 正如here中所述的Microsoft库的引用,very similar与您使用Java的库一样,默认加密模式是 CBC(通常被认为比欧洲央行更安全)。 CBC很可能也在您的图书馆中使用。

如果您想要相同的结果,则需要使用相同的加密模式。因此,要么在PHP代码中设置CBC(以及在Java中使用的相同IV),要么使用TripleDESCryptoServiceProvider在Java中设置ECB模式。