最近在做一个项目需要实现一个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加密算法在两个平台上的实现原理相同,但是关键在于确保两边使用的密钥一致,并且处理二进制数据时要正确地进行Base64编码和解码。 在Java中,执行DES加密通常涉及以下步骤: 1. 创建一个密钥:使用`...
总的来说,实现Java、C#和PHP之间的DES加密互通涉及理解每种语言的加密API,保持一致的密钥和IV管理,并确保加密后的数据格式兼容。在实际项目中,建议使用更现代的加密标准如AES,以获得更强的安全性和更好的性能。
本文将深入探讨一种在Java和PHP中通用的加密算法——DES(Data Encryption Standard),并详细解析其工作原理、应用实例以及跨语言互操作性。 ### 一、DES算法概述 DES是一种对称加密算法,由IBM公司开发,并于...
在本文中,我们将深入探讨如何实现兼容PHP和Java的DES(Data Encryption Standard)加密解密。DES是一种块密码,它使用56位密钥对64位的数据块进行加密。虽然DES现在已被AES(Advanced Encryption Standard)所取代...
总结来说,本例子展示了如何在Java和PHP之间使用DES加密进行数据安全传输,确保接口交互的安全性。尽管DES现在已经不是最安全的加密算法,但了解其工作原理和实现方式对于理解加密技术的基础是很有帮助的。在实际...
在本文中,我们将探讨如何在PHP、Java、Android和iOS平台上实现3DES加密解密的通用方法。 在PHP中,3DES加密通常使用`mcrypt`库进行实现。在给出的代码段中,可以看到一个名为`DES3`的类,其中包含了加密和解密的...
本主题聚焦于四种常用编程语言——Java、PHP、GOLang(Go语言)和JavaScript——之间的AES(Advanced Encryption Standard)ECB(Electronic Codebook)模式128位加密解密的互操作性。下面我们将详细探讨这些语言...
{* DELPHI、PHP、C#通用DES编码解码单元 *} {* 由TurboPower LockBox部分代码改写 *} {* 滕州市东鸣软件工作室制作 ZWF 2011-12-27 *} {*********************************************************} {EncryDes...
1. **密钥一致性**:在Java和PHP中,都需要使用相同的密钥进行加密和解密。密钥长度应为AES支持的128位、192位或256位,且在两个环境中都应保持一致。 2. **填充方式**:PHP中默认的填充方式可能与Java不同,因此...
在实际操作中,通常会使用`PKCS7`填充或者其他填充模式来保证数据块的完整性和一致性。 在跨平台项目中,实现`DES`加密解密的兼容性,需要确保所有平台的实现遵循相同的加密模式(如ECB、CBC等)、填充方式和密钥...
DESPlus是一种基于传统数据加密标准(DES)的增强加密算法,它在DES的基础上增加了自定义的填充和编码方式,使得加密后的结果可以转化为可读的数字和字母组合,方便在某些场景下使用和理解。本PHP实现是针对网上常见...
然而,当我们需要在不同语言间(如PHP、Java和C#)进行加密解密时,需要注意填充模式的一致性。PHP的mcrypt扩展默认使用PKCS5填充,而Java和.NET通常使用PKCS7。因此,为了使不同平台之间的加密结果兼容,我们需要在...
3. 考虑到兼容性问题,确保这个Java实现能够与Discuz现有的PHP版本无缝对接,处理好字符集和编码的问题。 4. 在实际使用中,务必遵循安全编码的最佳实践,如使用安全的随机数生成器,避免硬编码密钥,以及对敏感数据...
AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它基于块加密,使用固定的128位块大小和可变的密钥长度(128...同时,加密结果应当以Base64或其他编码格式进行传输和存储,以便于处理二进制数据。
如果你有其他语言版本的加密解密代码,可以按照类似的方式理解其工作原理,并与Java版本进行对比,以确保在不同平台上的一致性和兼容性。在跨平台通信时,确保所有实现都遵循同样的加密算法和密钥管理策略,才能有效...
在PHP中,3DES(Triple Data Encryption Algorithm)是一种常见的加密算法,它基于DES(Data Encryption Standard)并进行了三次迭代以增强安全性。然而,当你尝试在PHP代码中使用`mcrypt_module_open()`函数进行3...
本资源提供了在QT环境下实现的加密解密功能,并且兼容其他多种编程语言,如PHP、C#、Java和Golang,这为在不同语言之间进行安全的socket通信提供了便利。 QT是一个强大的C++库,它提供了丰富的图形用户界面(GUI)...
在PHP编程中,对称加密是一种常见的数据加密技术,它使用相同的密钥进行加密和解密操作。这个压缩包文件“php提供的对称加密算法类.zip”包含了...在实际应用中,还需要结合良好的编码实践和安全策略,确保数据的安全。
5. `Base64.java`:这是一个Base64编码和解码的Java类,用于在传输过程中对数据进行编码,以确保兼容性和安全性。 6. `SymmtricCryptoUtil.java`:这可能包含了对称加密的工具类,3DES就属于对称加密的一种。 7. `...