需要用于php加密脚本的similler java代码

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

PHP代码:

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; } 

在此先感谢Aniruddha

这应该做到这一点。

 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; } 

java中MCRYPT_RIJNDAEL_128和MCRYPT_MODE_CBC的等价物是AES / CBC / NoPadding。 您还需要一个用于Base64编码的实用程序,上面的代码使用Apache Codec库中的Base64

此外,由于加密密钥是256位,因此您需要Java密码术扩展(JCE)无限强度管辖权策略文件 。 这些可以从Oracle的网站下载。

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