原文 http://my.oschina.net/penngo/blog/347248
php服务器,java服务器,android,ios开发兼容的3des加密解密,
php
class DES3 {
var $key = "my.oschina.net/penngo?#@";
var $iv = "01234567";
function encrypt($input){
$size =mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);
$input =$this->pkcs5_pad($input, $size);
$key =str_pad($this->key,24,'0');
$td =mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
if($this->iv == '' )
{
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
}
else
{
$iv = $this->iv;
}
@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 =str_pad($this->key,24,'0');
$td =mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');
if($this->iv == '' )
{
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
}
else
{
$iv = $this->iv;
}
$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;
}
returnsubstr($text, 0, -1 * $pad);
}
function PaddingPKCS7($data) {
$block_size= mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$padding_char = $block_size - (strlen($data) % $block_size);
$data .=str_repeat(chr($padding_char),$padding_char);
return$data;
}
}
$des = new DES3();
echo $ret = $des->encrypt("来自http://my.oschina.net/penngo的博客"). "\n";
echo $des->decrypt($ret) . "\n";
java(android)
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
public class DES3 {
// 密钥
private final static String secretKey = "my.oschina.net/penngo?#@";
// 向量
private final static String iv = "01234567";
// 加解密统一使用的编码方式
private final static String encoding = "utf-8";
public static String encode(String plainText) throws Exception{
Key deskey = null ;
DESedeKeySpec spec = newDESedeKeySpec(secretKey.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede" );
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding");
IvParameterSpec ips = newIvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, deskey,ips);
byte [] encryptData =cipher.doFinal(plainText.getBytes(encoding));
return Base64.encode(encryptData);
}
public static String decode(String encryptText) throws Exception{
Key deskey = null ;
DESedeKeySpec spec = newDESedeKeySpec(secretKey.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede" );
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding");
IvParameterSpec ips = newIvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, deskey,ips);
byte [] decryptData =cipher.doFinal(Base64.decode(encryptText));