如何解密用Java加密的文本(mcrypt_rijndael_256)

时间:2016-08-04 11:48:00

标签: java encryption aes rijndael

我在解密Java中用PHP发送的一些文本时遇到了一些问题。我已经为C#中的程序的Windows版本编写了代码,但我不熟悉Java,所以这可能比我做的更简单。

PHP中的加密代码:

function encryptString($plain)
{
   $iv = "12347112549354892543218565456541";
   $ftpSalt = "hjjuoelkdploida";

   $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);  

   $padding = $block - (strlen($plain) % $block);
   $plain .= str_repeat(chr($padding), $padding);
   $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $ftpSalt, $plain, MCRYPT_MODE_CBC, $iv);
   $crypttext64 = base64_encode($crypttext);

   return $crypttext64;
}

解密的C#函数:

static public String doDecryptRJ256(string cypher)
{
    var sRet = "";
    var cypherByte = Decode(cypher);

    var encoding = new UTF8Encoding();
    var Key = encoding.GetBytes(mKey);
    var IV = encoding.GetBytes(mIv);

    using (var rj = new RijndaelManaged())
    {
        try
        {
            rj.Padding = PaddingMode.PKCS7;
            rj.Mode = CipherMode.CBC;
            rj.KeySize = 256;
            rj.BlockSize = 256;
            rj.Key = Key;
            rj.IV = IV;
            var ms = new MemoryStream(cypherByte);

            using (var cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
            {
                using (var sr = new StreamReader(cs))
                {
                    sRet = sr.ReadLine();
                }
            }
        }
        finally
        {
                rj.Clear();
        }
    }

    return sRet;
 }

}

我尝试过互联网上的各种建议,但没有找到任何实际工作的建议。最新的建议我尝试了另一个答案:

            byte[] cipherText = encryptedText.getBytes("UTF-8");

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec key = new SecretKeySpec(KEY.getBytes("UTF-8"), "AES");
            cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
            return new String(cipher.doFinal(cipherText),"UTF-8");

我知道以前曾问过类似的问题,但解决方案(可能由于我自己的无知)并没有帮助我实现这一目标。我之前没有做过任何加密工作,所以可能还有一些我没有得到的东西。

加密和解密的代码在我的控制范围内,所以如果有人想为所有三种语言建议替代方法,我愿意改变加密方法。

0 个答案:

没有答案