跟人合作搞个Android App,我负责服务器端 用的是PHP,
手机端和服务器端之间的数据传输有加密,
他手机端用的是这个JAVA的数据加密类,
求相对应的PHP版本 数据加密类。
<code class="lang-java">package com.ssh.util; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; /** * DESede对称加密算法演示 * * @author zolly * */ public class DESedeCoder { /** * 密钥算法 * */ public static final String KEY_ALGORITHM = "DESede"; /** * 加密/解密算法/工作模式/填充方式 * */ public static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding"; /** * * 生成密钥 * * @return byte[] 二进制密钥 * */ public static byte[] initkey() throws Exception { // 实例化密钥生成器 KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); // 初始化密钥生成器 kg.init(168); // 生成密钥 SecretKey secretKey = kg.generateKey(); // 获取二进制密钥编码形式 byte[] key = secretKey.getEncoded(); BufferedOutputStream keystream = new BufferedOutputStream(new FileOutputStream("DESedeKey.dat")); keystream.write(key, 0, key.length); keystream.flush(); keystream.close(); return key; } /** * 转换密钥 * * @param key * 二进制密钥 * @return Key 密钥 * */ public static Key toKey(byte[] key) throws Exception { // 实例化Des密钥 DESedeKeySpec dks = new DESedeKeySpec(key); // 实例化密钥工厂 SecretKeyFactory keyFactory = SecretKeyFactory .getInstance(KEY_ALGORITHM); // 生成密钥 SecretKey secretKey = keyFactory.generateSecret(dks); return secretKey; } /** * 加密数据 * * @param data * 待加密数据 * @param key * 密钥 * @return byte[] 加密后的数据 * */ public static byte[] encrypt(byte[] data, byte[] key) throws Exception { // 还原密钥 Key k = toKey(key); // 实例化 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 初始化,设置为加密模式 cipher.init(Cipher.ENCRYPT_MODE, k); // 执行操作 return cipher.doFinal(data); } /** * 解密数据 * * @param data * 待解密数据 * @param key * 密钥 * @return byte[] 解密后的数据 * */ public static byte[] decrypt(byte[] data, byte[] key) throws Exception { // 欢迎密钥 Key k = toKey(key); // 实例化 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 初始化,设置为解密模式 cipher.init(Cipher.DECRYPT_MODE, k); // 执行操作 return cipher.doFinal(data); } /** * 加密字符串 * @param data * @return */ public static String encode(String str,String screatKey){ String result = ""; byte[] data = DESedeCoder.encrypt(str.getBytes(), screatKey.getBytes()); result = Base64.encode(data); return result; } /** * 解密字符串 * @param str * @return */ public static String decode(String str,String screatKey){ String result = ""; try { byte[] data = Base64.decode(str); data = DESedeCoder.decrypt(data, screatKey.getBytes()); result = new String(data); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 进行加解密的测试 * * @throws Exception */ public static void main(String[] args) throws Exception { String key = "2C7dDYBy20mmKy3391xivikz"; String str = "hello world~"; System.out.println("Key:"+key); System.out.println("原文:" + str); //加密 String value = encode(str,key); System.out.println("加密后:" + value); System.out.println("解密后:" + decode(value,key)); } } </code>
跟人合作搞个Android App,我负责服务器端 用的是PHP,
手机端和服务器端之间的数据传输有加密,
他手机端用的是这个JAVA的数据加密类,
求相对应的PHP版本 数据加密类。
<code class="lang-java">package com.ssh.util; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; /** * DESede对称加密算法演示 * * @author zolly * */ public class DESedeCoder { /** * 密钥算法 * */ public static final String KEY_ALGORITHM = "DESede"; /** * 加密/解密算法/工作模式/填充方式 * */ public static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding"; /** * * 生成密钥 * * @return byte[] 二进制密钥 * */ public static byte[] initkey() throws Exception { // 实例化密钥生成器 KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); // 初始化密钥生成器 kg.init(168); // 生成密钥 SecretKey secretKey = kg.generateKey(); // 获取二进制密钥编码形式 byte[] key = secretKey.getEncoded(); BufferedOutputStream keystream = new BufferedOutputStream(new FileOutputStream("DESedeKey.dat")); keystream.write(key, 0, key.length); keystream.flush(); keystream.close(); return key; } /** * 转换密钥 * * @param key * 二进制密钥 * @return Key 密钥 * */ public static Key toKey(byte[] key) throws Exception { // 实例化Des密钥 DESedeKeySpec dks = new DESedeKeySpec(key); // 实例化密钥工厂 SecretKeyFactory keyFactory = SecretKeyFactory .getInstance(KEY_ALGORITHM); // 生成密钥 SecretKey secretKey = keyFactory.generateSecret(dks); return secretKey; } /** * 加密数据 * * @param data * 待加密数据 * @param key * 密钥 * @return byte[] 加密后的数据 * */ public static byte[] encrypt(byte[] data, byte[] key) throws Exception { // 还原密钥 Key k = toKey(key); // 实例化 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 初始化,设置为加密模式 cipher.init(Cipher.ENCRYPT_MODE, k); // 执行操作 return cipher.doFinal(data); } /** * 解密数据 * * @param data * 待解密数据 * @param key * 密钥 * @return byte[] 解密后的数据 * */ public static byte[] decrypt(byte[] data, byte[] key) throws Exception { // 欢迎密钥 Key k = toKey(key); // 实例化 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 初始化,设置为解密模式 cipher.init(Cipher.DECRYPT_MODE, k); // 执行操作 return cipher.doFinal(data); } /** * 加密字符串 * @param data * @return */ public static String encode(String str,String screatKey){ String result = ""; byte[] data = DESedeCoder.encrypt(str.getBytes(), screatKey.getBytes()); result = Base64.encode(data); return result; } /** * 解密字符串 * @param str * @return */ public static String decode(String str,String screatKey){ String result = ""; try { byte[] data = Base64.decode(str); data = DESedeCoder.decrypt(data, screatKey.getBytes()); result = new String(data); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 进行加解密的测试 * * @throws Exception */ public static void main(String[] args) throws Exception { String key = "2C7dDYBy20mmKy3391xivikz"; String str = "hello world~"; System.out.println("Key:"+key); System.out.println("原文:" + str); //加密 String value = encode(str,key); System.out.println("加密后:" + value); System.out.println("解密后:" + decode(value,key)); } } </code>
还是靠自己比较靠谱。。。
<code class="lang-php">/** * DESede 数据加密解密类 * * @author thisky@qq.com */ class DESedeCoder { public static function encrypt($str, $key) { $td = self::gettd($key); $ret = base64_encode(mcrypt_generic($td, self::pkcs5_pad($str, 8))); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } public static function decrypt($str, $key) { $td = self::gettd($key); $ret = self::pkcs5_unpad(mdecrypt_generic($td, base64_decode($str))); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } private static function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } private static 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); } private static function getiv() { return pack('H16', '0102030405060708'); } private static function gettd($key) { $iv = self::getiv(); $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, ''); mcrypt_generic_init($td, $key, $iv); return $td; } } </code>
aes(字数补丁)
在吗!我遇到同样的问题!求帮助!