• php 3des加密算法以及与java,.net,c#的交互的一致性


    概念性的东西:
    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&nbsp;Encrypt3des&nbsp;{
    &nbsp;&nbsp;var&nbsp;$key&nbsp;=&nbsp;'20C86125F86DB932D0139D32D9208CEF52BAEC98F1E9BA2A';
    &nbsp;&nbsp;var&nbsp;$iv&nbsp;='0102030405060708';
    
        function&nbsp;pad($text)&nbsp;{
            $text_add&nbsp;=&nbsp;strlen($text)&nbsp;%&nbsp;8;
    
            for($i&nbsp;=&nbsp;$text_add;&nbsp;$i&nbsp;<&nbsp;8;&nbsp;$i++)&nbsp;{
                $text&nbsp;.=&nbsp;chr(8&nbsp;-&nbsp;$text_add);
            }&nbsp;
            return&nbsp;$text;
        }&nbsp;
    
        function&nbsp;unpad($text)&nbsp;{
    
            $pad&nbsp;=&nbsp;ord($text{strlen($text)-1});
    
            if&nbsp;($pad&nbsp;>&nbsp;strlen($text))&nbsp;{
                return&nbsp;false;
            }&nbsp;
            if&nbsp;(strspn($text,&nbsp;chr($pad),&nbsp;strlen($text)&nbsp;-&nbsp;$pad)&nbsp;!=&nbsp;$pad)&nbsp;{
                return&nbsp;false;
            }&nbsp;
            return&nbsp;substr($text,&nbsp;0,&nbsp;-1&nbsp;*&nbsp;$pad);
        }&nbsp;
    
        function&nbsp;encrypt($key,&nbsp;$iv,&nbsp;$text)&nbsp;{
    
            $key_add&nbsp;=&nbsp;24&nbsp;-&nbsp;strlen($key);
            $key&nbsp;.=&nbsp;substr($key,&nbsp;0,&nbsp;$key_add);
    
            $text&nbsp;=&nbsp;$this&nbsp;->&nbsp;pad($text);
            $td&nbsp;=&nbsp;mcrypt_module_open&nbsp;(MCRYPT_3DES,&nbsp;'',&nbsp;MCRYPT_MODE_CBC,&nbsp;'');
    
            mcrypt_generic_init&nbsp;($td,&nbsp;$key,&nbsp;$iv);
    
            $encrypt_text&nbsp;=&nbsp;mcrypt_generic&nbsp;($td,&nbsp;$text);
    
            mcrypt_generic_deinit($td);
    
            mcrypt_module_close($td);
    
            return&nbsp;$encrypt_text;
        }&nbsp;
    
        function&nbsp;decrypt($key,&nbsp;$iv,&nbsp;$text)&nbsp;{
            $key_add&nbsp;=&nbsp;24&nbsp;-&nbsp;strlen($key);
    
            $key&nbsp;.=&nbsp;substr($key,&nbsp;0,&nbsp;$key_add);
    
            $td&nbsp;=&nbsp;mcrypt_module_open&nbsp;(MCRYPT_3DES,&nbsp;'',&nbsp;MCRYPT_MODE_CBC,&nbsp;'');
    
            mcrypt_generic_init&nbsp;($td,&nbsp;$key,&nbsp;$iv);
    
            $text&nbsp;=&nbsp;mdecrypt_generic&nbsp;($td,&nbsp;$text);
    
            mcrypt_generic_deinit($td);
    
            mcrypt_module_close($td);
    
            return&nbsp;$this&nbsp;->&nbsp;unpad($text);
        }&nbsp;
    
    &nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;encode($text){
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;pack('H*',$this->key);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$iv&nbsp;&nbsp;=&nbsp;pack('H*',$this->iv);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this->encrypt($key,&nbsp;$iv,&nbsp;$text);
    
    &nbsp;&nbsp;&nbsp;&nbsp;}
    
    &nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;decode($text){
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;pack('H*',$this->key);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$iv&nbsp;&nbsp;=&nbsp;pack('H*',$this->iv);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this->decrypt($key,&nbsp;$iv,&nbsp;$text);
    &nbsp;&nbsp;&nbsp;&nbsp;}
    }&nbsp;
    
    
    $text&nbsp;=&nbsp;'helloworld';
    
    $crypt&nbsp;=&nbsp;new&nbsp;Encrypt3des();
    print&nbsp;base64_encode($crypt&nbsp;->&nbsp;encode($text));
    print&nbsp;"<br>";
    print&nbsp;$crypt&nbsp;->&nbsp;decode($crypt&nbsp;->&nbsp;encode($text));
    ?>


    来自:http://blog.sevenight.com/index.php?m=blog&a=show&id=150

  • 相关阅读:
    统计数据库中表,视图,存储过程个数
    MVC4 上传图片并生成缩略图
    如何获取版本的 Internet 信息服务器 (IIS)
    验证码(中)——封装.使用
    验证码(上)——创建验证码
    javascript中window.open()与window.location.href
    PHP-文件目录操作
    功能三——读取试题列表与分页显示
    PHP开发-模板的使用
    面向对象
  • 原文地址:https://www.cnblogs.com/qq278360339/p/3120738.html
Copyright © 2020-2023  润新知