最近在做一个项目需要实现一个SSO,这个项目是由两个Team共同开发,其中一个Team使用Java作为开发语言,另一个通过PHP。这样就存在一个在Java和PHP中传递用户身份的问题,实现方法是通过DES加密Cookie实现,这样就要求Java和PHP在DES以后出来的结果一致,费劲一番周折终于实现这两种语言实现相同结果的代码,代码如下:
Java代码
/* * @(#)CookieCrypt.java * * Create Version: 1.0.0 * Author: Cobra Pang * Create Date: 2007-12-17 * * Copyright (c) 2006 UTStarcom(China) Corporation. All Right Reserved. */ import java.io.IOException;import java.security.SecureRandom; import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; /** * CookieCrypt * @author Cobra Pang * @version 1.0.0 2007-12-17 */public class CookieCrypt { // Crypt Key private byte[] desKey; public CookieCrypt(String desKey) { this.desKey = desKey.getBytes(); } /** * DES Encoder * @param plainText * @return * @throws Exception */ public byte[] desEncrypt(byte[] plainText) throws Exception { SecureRandom sr = new SecureRandom(); byte rawKeyData[] = desKey; DESKeySpec dks = new DESKeySpec(rawKeyData); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey key = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, key, sr); byte data[] = plainText; byte encryptedData[] = cipher.doFinal(data); return encryptedData; } /** * DES Decoder * @param encryptText * @return * @throws Exception */ public byte[] desDecrypt(byte[] encryptText) throws Exception { SecureRandom sr = new SecureRandom(); byte rawKeyData[] = desKey; DESKeySpec dks = new DESKeySpec(rawKeyData); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey key = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, key, sr); byte encryptedData[] = encryptText; byte decryptedData[] = cipher.doFinal(encryptedData); return decryptedData; } /** * Cookie Encoder * @param input * @return * @throws Exception */ public String encrypt(String input) throws Exception { return base64Encode(desEncrypt(input.getBytes())); } /** * Cookie Decoder * @param input * @return * @throws Exception */ public String decrypt(String input) throws Exception { byte[] result = base64Decode(input); return new String(desDecrypt(result)); } /** * Base64 Encode * @param s * @return */ public static String base64Encode(byte[] s) { if (s == null) return null; BASE64Encoder b = new sun.misc.BASE64Encoder(); return b.encode(s); } /** * Base64 Decode * @param s * @return * @throws IOException */ public static byte[] base64Decode(String s) throws IOException { if (s == null) return null; BASE64Decoder decoder = new BASE64Decoder(); byte[] b = decoder.decodeBuffer(s); return b; } public static void main(String[] args) throws Exception { String key = "123321"; String input = "1|utstar@utstar.com|11000000000000|"; CookieCrypt crypt = new CookieCrypt(key); System.out.println("Encode:" + crypt.encrypt(input)); System.out.println("Decode:" + crypt.decrypt(crypt.encrypt(input))); }}
PHP代码
<?php/* * @(#)CookieCrypt.php * * Create Version: 1.0.0 * Author: Cobra Pang * Create Date: 2007-12-17 * * Copyright (c) 2006 UTStarcom(China) Corporation. All Right Reserved. */class CookieCrypt { var $key; function CookieCrypt($key) { $this->key = $key; } function encrypt($input) { $size = mcrypt_get_block_size('des', 'ecb'); $input = $this->pkcs5_pad($input, $size); $key = $this->key; $td = mcrypt_module_open('des', '', 'ecb', ''); $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); @mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } function decrypt($encrypted) { $encrypted = base64_decode($encrypted); $key =$this->key; $td = mcrypt_module_open('des','','ecb',''); //使用MCRYPT_DES算法,cbc模式 $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); $ks = mcrypt_enc_get_key_size($td); @mcrypt_generic_init($td, $key, $iv); //初始处理 $decrypted = mdecrypt_generic($td, $encrypted); //解密 mcrypt_generic_deinit($td); //结束 mcrypt_module_close($td); $y=$this->pkcs5_unpad($decrypted); return $y; } function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } function pkcs5_unpad($text) { $pad = ord($text{strlen($text)-1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); }} $key = "123321";$input = "1|utstar@utstar.com|11000000000000|"; $crypt = new CookieCrypt($key);echo "Encode:".$crypt->encrypt($input)."<br/>";echo "Decode:".$crypt->decrypt($crypt->encrypt($input));?>
分享到:
相关推荐
这是一个DES加密算法,使用的方式是采用Java进行编码
java和C#的通用型加解密
以前用java做后台时候有过加密,就拿过来,用php调通了,在3个平台间加解密的结果一致,我相信还会有很多朋友为此困惑,在此分享一套3DES加密程序,能够实现php、Android和iPhone三个平台加解密一致。
使用java和C语言描述的,保证加密的结果是一致的。
DES加密,DES解密,可以输入密钥后进行加密和解密,支持可逆加密解密。内含PHP加密、解密 和 JAVA加密解密,双方可以互通,亲测有效
java实现的3DES加密算法,类中支持多种密钥长度
NULL 博文链接:https://zhangyou1010.iteye.com/blog/1432118
Java实现文件的RSA和DES加密 说明代码
php实现的代码des加密解密,适用于java的des加密解密。
PHP 3des 对称加密解密,与 java c#兼容
DES算法的JAVA实现源代码,研究DES的朋友值得下载
des加密解密java实现des加密解密java实现des加密解密java实现des加密解密java实现des加密解密java实现des加密解密java实现
c#和java通用DES加密
C#与JAVA通用DES: 1、C#平台上的加密与解密 2、JAVA平台上的加密与解密 3、C#平台上的加密,能在JAVA平台上解密 4、JAVA平台上的加密,能在C#平台上解密 这个工具类,是基于平台的,不调用任何第三方软件,已经运用...
java和javascript加密解密,可相互加密解密,内含javascript代码和java代码,解压即用,自定义密钥
Java 中的 3DES 加密解密示例(封装 byte 数组和 16 进制字符串互转) 在 Java 中,3DES 加密是一种常用的加密算法,它可以将明文数据转换为密文数据,以保护数据的安全性。在本示例中,我们将展示如何使用 3DES ...
Java c++通过des加密的结果不一样【已解决】 最近做了一个接口,需要和C++进行通讯,通讯的参数采用des加密,但调试的时候却发现同样的明文和密钥加密出来的结果却是不一样的。 收藏网络总结代码
Java实现的3DES程序.可以加密字符串。只需稍作修改就可以实现不同的模式,CBC OFB CFB CTR等模式。
Java加密组件实现DES、RSA和SHA加密算法 - Java源码 - JAVA & XML - 源码
基于java的开发源码-用Java加密类实现DES、RSA及SHA的加密算法.zip 基于java的开发源码-用Java加密类实现DES、RSA及SHA的加密算法.zip 基于java的开发源码-用Java加密类实现DES、RSA及SHA的加密算法.zip 基于java的...