php 3des加密算法以及与java,.net,c#的交互的一致性
2013-06-06 11:14
423 查看
概念性的东西:
3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样, 3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
3DES加密算法:密钥长度不足24字节时,右补ASCII字符“0”;内容采用PKCS5Padding方式填充,即长度以8字节切分,不能被8整除的末尾部分,根据长度不足8字节的部分,填充“0x01”—“0x08”,如不足1字节,则填充1个“0x01”,如不足2字节,则填充2个“0x02”,以此类推,如整除,则填充8个“0x08”
PHP内置的mcrypt库支持多种块状加密算法,包括DES,3DES和Blowfish(默认算法)等。由于是块状加密(Block Ciper),mcrypt支持以下模式对输入字符串进行操作:CBC, OFB, CFB和ECB。
php
3des key的长度为24字节,iv为8字节.
如果提供的key为48位,可以用pack("H48", $key) , 同理iv也可以用pack("H16", $iv);
如果提供的key为32位,可以用base64_decode解码,正好也是24位.
附简单的例子以及pkcs5填充
附网上加解密的类
来自:http://blog.sevenight.com/index.php?m=blog&a=show&id=150
3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样, 3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
3DES加密算法:密钥长度不足24字节时,右补ASCII字符“0”;内容采用PKCS5Padding方式填充,即长度以8字节切分,不能被8整除的末尾部分,根据长度不足8字节的部分,填充“0x01”—“0x08”,如不足1字节,则填充1个“0x01”,如不足2字节,则填充2个“0x02”,以此类推,如整除,则填充8个“0x08”
PHP内置的mcrypt库支持多种块状加密算法,包括DES,3DES和Blowfish(默认算法)等。由于是块状加密(Block Ciper),mcrypt支持以下模式对输入字符串进行操作:CBC, OFB, CFB和ECB。
php
3des key的长度为24字节,iv为8字节.
如果提供的key为48位,可以用pack("H48", $key) , 同理iv也可以用pack("H16", $iv);
如果提供的key为32位,可以用base64_decode解码,正好也是24位.
附简单的例子以及pkcs5填充
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 = "20C86125F86DB932D0139D32D9208CEF52BAEC98F1E9BA2A"; $key = pack("H48", $key); $iv = "0102030405060708"; $iv = pack("H16", $iv); $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($td, $key, $iv); $str = base64_encode(mcrypt_generic($td,pkcs5_pad("helloworld",8))); echo $str .""; mcrypt_generic_deinit($td); mcrypt_module_close($td); $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($td, $key, $iv); $ttt = pkcs5_unpad(mdecrypt_generic($td, base64_decode($str))); mcrypt_generic_deinit($td); mcrypt_module_close($td); echo $ttt;
附网上加解密的类
<?php Class Encrypt3des { var $key = '20C86125F86DB932D0139D32D9208CEF52BAEC98F1E9BA2A'; var $iv ='0102030405060708'; function pad($text) { $text_add = strlen($text) % 8; for($i = $text_add; $i < 8; $i++) { $text .= chr(8 - $text_add); } return $text; } function 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); } function encrypt($key, $iv, $text) { $key_add = 24 - strlen($key); $key .= substr($key, 0, $key_add); $text = $this -> pad($text); $td = mcrypt_module_open (MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init ($td, $key, $iv); $encrypt_text = mcrypt_generic ($td, $text); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $encrypt_text; } function decrypt($key, $iv, $text) { $key_add = 24 - strlen($key); $key .= substr($key, 0, $key_add); $td = mcrypt_module_open (MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init ($td, $key, $iv); $text = mdecrypt_generic ($td, $text); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $this -> unpad($text); } function encode($text){ $key = pack('H*',$this->key); $iv = pack('H*',$this->iv); return $this->encrypt($key, $iv, $text); } function decode($text){ $key = pack('H*',$this->key); $iv = pack('H*',$this->iv); return $this->decrypt($key, $iv, $text); } } $text = 'helloworld'; $crypt = new Encrypt3des(); print base64_encode($crypt -> encode($text)); print "<br>"; print $crypt -> decode($crypt -> encode($text)); ?>
来自:http://blog.sevenight.com/index.php?m=blog&a=show&id=150
相关文章推荐
- 《正版分享》2014年传智播客.NET JAVA 安卓 C/C# C++ PHP IOS WIN8 平面设计 视频教程
- php 的 3des加解密类,兼容C#/java
- 《正版分享》2014年传智播客.NET JAVA 安卓 C/C# C++ PHP IOS WIN8 平面设计 视频教程
- atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
- javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子
- Java之父称PHP,Ruby以及C#,不足为惧
- java之php、Android、JAVA、C# 3DES加密解密
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- PHP加密算法(兼容Java,.net)收集
- .Net/C# 与 J2EE/Java Web Service 互操作完整实例
- .m文件编译成com/.Net Assembly以及C#反射
- 最最基层的ajax交互代码jquery+java之间的json跨域传递以及java的json代码返回
- 了解实际开发中 Hashtable 的特性原理 .NET, JAVA, PHP (之一)
- C# 制作Com组件:java调用.net DLL的方法
- 再谈C# ,C++和java 以及C
- 年薪20万-50万招聘Java、PHP、.Net、iOS、C/C++、网页平面讲师
- NeuralBuild-用于Java、C#、PHP的DAO产生器
- 加密算法之C#兼容PHP中MD5加密
- Atitit. 注册表操作查询 修改 api与工具总结 java c# php js python 病毒木马的原理
- C#与C++的相似以及参照java,C++来学习C#