需要simpy java代码的php加密脚本 [英] Require similler java code for php encryption script
问题描述
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屋!