论坛风格切换
  • 2343阅读
  • 0回复

java和php对等的3DES加密算法 [复制链接]

上一主题 下一主题
离线太史慈
 

发帖
766
金币
626
威望
556
只看楼主 倒序阅读 使用道具 楼主  发表于: 2013-06-17
— 本帖被 云天河 从 java技术交流 移动到本区(2014-07-24) —
网上找了好几个,都不能用。
发现php在加密的时候,有个$key,还有个$iv,
很多java的3DES加密算法里面没有$iv的。

最终找到了一个版本http://jamie-wang.iteye.com/blog/1604596

java代码:
  1. package org.jamie.demo;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.Security;
  4. import java.util.Random;
  5. import javax.crypto.Cipher;
  6. import javax.crypto.KeyGenerator;
  7. import javax.crypto.SecretKey;
  8. import javax.crypto.SecretKeyFactory;
  9. import javax.crypto.spec.DESedeKeySpec;
  10. import javax.crypto.spec.IvParameterSpec;
  11. @SuppressWarnings("restriction")
  12. public class TripleDES {
  13.     static {
  14.         Security.addProvider(new com.sun.crypto.provider.SunJCE());
  15.     }
  16.     private static final String MCRYPT_TRIPLEDES = "DESede";
  17.     private static final String TRANSFORMATION = "DESede/CBC/PKCS5Padding";
  18.     public static byte[] decrypt(byte[] data, byte[] key, byte[] iv) throws Exception {
  19.         DESedeKeySpec spec = new DESedeKeySpec(key);
  20.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(MCRYPT_TRIPLEDES);
  21.         SecretKey sec = keyFactory.generateSecret(spec);
  22.         Cipher cipher = Cipher.getInstance(TRANSFORMATION);
  23.         IvParameterSpec IvParameters = new IvParameterSpec(iv);
  24.         cipher.init(Cipher.DECRYPT_MODE, sec, IvParameters);
  25.         return cipher.doFinal(data);
  26.     }
  27.     public static byte[] encrypt(byte[] data, byte[] key, byte[] iv) throws Exception {
  28.         DESedeKeySpec spec = new DESedeKeySpec(key);
  29.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
  30.         SecretKey sec = keyFactory.generateSecret(spec);
  31.         Cipher cipher = Cipher.getInstance(TRANSFORMATION);
  32.         IvParameterSpec IvParameters = new IvParameterSpec(iv);
  33.         cipher.init(Cipher.ENCRYPT_MODE, sec, IvParameters);
  34.         return cipher.doFinal(data);
  35.     }
  36.     public static byte[] generateSecretKey() throws NoSuchAlgorithmException {
  37.         KeyGenerator keygen = KeyGenerator.getInstance(MCRYPT_TRIPLEDES);
  38.         return keygen.generateKey().getEncoded();
  39.     }
  40.     public static byte[] randomIVBytes() {
  41.         Random ran = new Random();
  42.         byte[] bytes = new byte[8];
  43.         for (int i = 0; i < bytes.length; ++i) {
  44.             bytes<i> = (byte) ran.nextInt(Byte.MAX_VALUE + 1);
  45.         }
  46.         return bytes;
  47.     }
  48.     public static void main(String args[]) throws Exception {
  49.         String plainText = "a12*&1c中文";
  50.         final byte[] secretBytes = TripleDES.generateSecretKey();
  51.         final byte[] ivbytes = TripleDES.randomIVBytes();
  52.         System.out.println("plain text: " + plainText);
  53.         byte[] encrypt = TripleDES.encrypt(plainText.getBytes(), secretBytes, ivbytes);
  54.         System.out.println("cipher text: " + encrypt);
  55.         System.out.println("decrypt text: " + new String(TripleDES.decrypt(encrypt, secretBytes, ivbytes), "UTF-8"));
  56.     }
  57. }</i>



php代码
  1. <?php
  2. class TripleDES {
  3.     public static function genIvParameter() {
  4.         return mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_CBC), MCRYPT_RAND);
  5.     }
  6.     private static function pkcs5Pad($text, $blocksize) {
  7.         $pad = $blocksize - (strlen($text) % $blocksize); // in php, strlen returns the bytes of $text
  8.         return $text . str_repeat(chr($pad), $pad);
  9.     }
  10.     private static function pkcs5Unpad($text) {
  11.         $pad = ord($text{strlen($text)-1});
  12.         if ($pad > strlen($text)) return false;
  13.         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
  14.         return substr($text, 0, -1 * $pad);
  15.     }
  16.     public static function encryptText($plain_text, $key, $iv) {
  17.         $padded = TripleDES::pkcs5Pad($plain_text, mcrypt_get_block_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_CBC));
  18.         return mcrypt_encrypt(MCRYPT_TRIPLEDES, $key, $padded, MCRYPT_MODE_CBC, $iv);
  19.     }
  20.     public static function decryptText($cipher_text, $key, $iv) {
  21.         $plain_text = mcrypt_decrypt(MCRYPT_TRIPLEDES, $key, $cipher_text, MCRYPT_MODE_CBC, $iv);
  22.         return TripleDES::pkcs5Unpad($plain_text);
  23.     }
  24. };
  25. /*
  26. function main() {
  27.     $iv = TripleDES::genIvParameter();
  28.     print "\$iv=$iv\n";
  29.     $plain_text="this is a test,包括中文";
  30.     $key="ABCDEFGHIJ0123456789ABCD";
  31.     $cipher_text = TripleDES::encryptText($plain_text, $key, $iv);
  32.     print "\$cipher_text=$cipher_text\n";
  33.     $plain_text = TripleDES::decryptText($cipher_text, $key, $iv);
  34.     print "\$plain_text=$plain_text\n";
  35. }
  36. main();
  37. */
  38. ?>


经测试:php使用类里面的encryptText函数加密和,和java的一样。

[url=http://www.phpwind.com]phpwind[/url]
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
提到某人:
选择好友
上一个 下一个