需要simpy java代码的php加密脚本 [英] Require similler java code for php encryption script

查看:177
本文介绍了需要simpy java代码的php加密脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个PHP加密功能。我需要一个java计数器的一部分。由于我对PHP的知识有限,我无法理解。有些人知道这两种语言,请帮助。



PHP代码:

 函数加密($ decryptpted,$ keyvalue){
//构建256位$密钥,这是$ keyvalue的SHA256哈希值。
$ key = hash('SHA256',$ keyvalue,true);
//构建$ iv和$ iv_base64。我们使用128位(AES兼容)和CBC模式的块大小。 (注意:ECB模式不足,因为不使用IV。)
srand(); $ iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),MCRYPT_RAND);
if(strlen($ iv_base64 = rtrim(base64_encode($ iv),'='))!= 22)return false;
//使用$ key加密$解密和$解密的MD5。 MD5在这里很好用,因为它只是为了验证成功的解密。
$ encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$ key,$ decryptpted。md5($ decryptpted),MCRYPT_MODE_CBC,$ iv));
//我们完成了!
返回$ iv_base64。 $加密;
}

提前感谢
Aniruddha

解决方案

应该这样做。

  public static byte [ ]加密(byte [] decryptpted,byte [] keyvalue)throws NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,InvalidAlgorithmParameterException,IllegalBlockSizeException,BadPaddingException {
MessageDigest sha256 = MessageDigest.getInstance(SHA-256);
byte [] key = sha256.digest(keyvalue);

MessageDigest md5 = MessageDigest.getInstance(MD5);
byte [] checksum = md5.digest(解密);

//要加密的值的长度必须是16的倍数。
byte [] decryptedAndChecksum = new byte [(decryptpted.length + md5.getDigestLength()+ 15)/ 16 * 16];
System.arraycopy(解密,0,decryptptedAndChecksum,0,decryptpted.length);
System.arraycopy(checksum,0,decryptptedAndChecksum,decryptpted.length,checksum.length);
//由于PHP pad为0,所以decryptedAndChecksum的剩余字节保持为0(默认字节值)。

SecureRandom rnd = new SecureRandom();
byte [] iv = new byte [16];
rnd.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);

密码密码= Cipher.getInstance(AES / CBC / NoPadding);
cipher.init(Cipher.ENCRYPT_MODE,新的SecretKeySpec(密钥,AES),ivSpec);
byte [] encrypted = Base64.encodeBase64(cipher.doFinal(decryptptedAndChecksum));

byte [] ivBase64 = Base64.encodeBase64String(iv).substring(0,22).getBytes();
byte [] output = new byte [encrypted.length + ivBase64.length];
System.arraycopy(ivBase64,0,output,0,ivBase64.length);
System.arraycopy(encrypted,0,output,ivBase64.length,encrypted.length);
返回输出;
}

相当于Java中的MCRYPT_RIJNDAEL_128和MCRYPT_MODE_CBC是AES / CBC / NoPadding。您还需要一个Base64编码的实用程序,上述代码使用Apache Codec库中的 Base64



另外,因为加密密钥是256位,所以需要使用 Java加密扩展(JCE)无限强度管理策略文件。这些可以从Oracle的网站下载。



最后,请注意ntoskrnl的警告。这种加密真的可以更好,不要从PHP手册复制粘贴。


I have a PHP encryption function. I need a java counter part for the same. Due to my limited knowledge in PHP I am unable to understand. Some one knows both the language, kindly help.

PHP code:

function encrypt($decrypted, $keyvalue) {
    // Build a 256-bit $key which is a SHA256 hash of $keyvalue.
    $key = hash('SHA256', $keyvalue, true);
    // Build $iv and $iv_base64.  We use a block size of 128 bits (AES compliant) and CBC mode.  (Note: ECB mode is inadequate as IV is not used.)
    srand(); $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
    if (strlen($iv_base64 = rtrim(base64_encode($iv), '=')) != 22) return false;
    // Encrypt $decrypted and an MD5 of $decrypted using $key.  MD5 is fine to use here because it's just to verify successful decryption.
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $decrypted . md5($decrypted), MCRYPT_MODE_CBC, $iv));
    // We're done!
    return $iv_base64 . $encrypted;
}

Thanks in advance Aniruddha

解决方案

This should do it.

public static byte[] encrypt(byte[] decrypted, byte[] keyvalue) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException{
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
    byte[] key = sha256.digest(keyvalue);

    MessageDigest md5 = MessageDigest.getInstance("MD5");
    byte[] checksum = md5.digest(decrypted);

    //The length of the value to encrypt must be a multiple of 16.
    byte[] decryptedAndChecksum = new byte[(decrypted.length + md5.getDigestLength() + 15) / 16 * 16];
    System.arraycopy(decrypted, 0, decryptedAndChecksum, 0, decrypted.length);
    System.arraycopy(checksum, 0, decryptedAndChecksum, decrypted.length, checksum.length);
    //The remaining bytes of decryptedAndChecksum stay as 0 (default byte value) because PHP pads with 0's.

    SecureRandom rnd = new SecureRandom();
    byte[] iv = new byte[16];
    rnd.nextBytes(iv);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);

    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), ivSpec);
    byte[] encrypted = Base64.encodeBase64(cipher.doFinal(decryptedAndChecksum));

    byte[] ivBase64 = Base64.encodeBase64String(iv).substring(0, 22).getBytes();
    byte[] output = new byte[encrypted.length + ivBase64.length];
    System.arraycopy(ivBase64, 0, output, 0, ivBase64.length);
    System.arraycopy(encrypted, 0, output, ivBase64.length, encrypted.length);
    return output;
}

The equivalent of MCRYPT_RIJNDAEL_128 and MCRYPT_MODE_CBC in java is AES/CBC/NoPadding. You also need a utility for Base64 encoding, the above code uses Base64 from the Apache Codec library.

Also, because the encryption key is 256 bits, you'll need the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files. These can be downloaded from Oracle's website.

Finally, do heed ntoskrnl's warning. This encryption really could be better, don't copy-paste from the PHP manual.

这篇关于需要simpy java代码的php加密脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆