精华内容
下载资源
问答
  • 2003年lo月第5期陈健:几种常用数据加密算法的比较45几种常用数据加密算法的比较Theo朋paris帆ofsoImoH姗伽崎一琳ed肪taD蝴了p归蚰Al酬thms陈健(福建商业高等专科学校计算机系福建福州350012)内容提要描述了密码体制...

    2003

    l

    o

    月第

    5

    健:几种常用数据加密算法的比较

    45

    几种常用数据加密算法的比较

    T

    he

    o

    par

    i

    s

    of

    soI

    m

    oH

    姗伽崎一琳

    ed

    t

    a

    D

    p

    Al

    t

    hm

    s

    (

    福建商业高等专科学校计算机系

    福建福州

    350012)

    内容提要

    描述了密码体制中几种数据加密算法的厚理及加密、解密过程,分析了各种算法的性能和适用的场合,提出了网络

    上实现数据加密较好的方法。

    关键词信息安垒算法公钥密钥

    中图分类号:

    TN

    918

    文献标识码:

    A

    文章编号:

    l

    8

    4940f

    2003)

    05

    一呻

    45

    一∞

    1

    网络发展的安全需求

    随着网络技术的发展及网上活动的丑益频繁,如何保证及

    加强信息安全性成为目前迫切需

    要解决的热点课题。网络的安

    全需求一般分为:

    ①数据保密:防止非授权用户截获并使用该数据;

    ②数据完整性:用户使用一种方案来确认网络上的数据在

    传输过程中没有被篡改;

    ③身份验证:用户需要对网络上的另一个用户进行验证.证

    实他就是他所声称的那个人;

    ④授权:用户需要控制谁能够访问网络上的信息并且能够

    进行何种操作;

    ⑤不可抵赖和不可否认:用户不能抵赖自已曾作出的行为,

    也不能否认曾经接到对方的信息.这在交易系统中十分重要。

    另外,保护硬件资源不被非法占有,软件资源免受病毒的侵

    害,都构成了整个信息网络上的安全需求。

    2

    密码体制概述

    防火墙等技术是一种被动的肪卫技术.而加密则是一种主

    动的防卫措施。网络安全的核心将建立在密码学理论与技术

    上。

    密码技术是保护信息安全的主要手段之一。使用密码技术

    不仅可以保证信息的机密性,而且可以保证信息的完整性和确

    证性.防止信息被篡改、伪造和假冒。从密码体制方面而言.密

    码体制有对称密钥密码技术和非对称密钥密码技术。对称密钥

    密码技术要求加密解密双方拥有相同的密钥;而非对称密钥密

    码技术是加密解密双方拥有不相同的密钥。在不知道陷门信息

    的情况下,加密密钥和解密密钥在计算上是不能相互算出的。

    密码学不仅仅是编码与破译的学问.而且包括安全管理、安

    全协议设计、秘密分存、散列函数等内容。到目前为止,密码学

    中出现了大量的新技术和新概念

    ,例如零知识证明技术、盲签

    名、比特承诺、遗忘传递、

    字化现金、量子密码技术、混炖密码

    等。

    3

    对称密钥密码技木

    3

    l

    序列密码

    序列密码的主要原理是,通过有限状态机产生性能优良的

    伪随机序列,使用该序列加密信息流

    (

    莲比特加密

    )

    得到密文序

    列。所以,序列密码算法的安全强度完全决定于它所产生的伪

    随机序列的好坏。衡量一个伪随机序列好坏的标准有多种,比

    较通用的有著名的

    c0

    蛐的三个条件:

    Ruep

    一的线性复杂度随

    机走动条件、线性逼近以及产生该序列的布尔函数满足的相关

    免疫条件等。

    3

    2

    分组密码

    分组密码的工作方式是将明文分成固定长度的组

    (

    )

    ,如

    64B

    一组.

    用同一密钥和算法

    对每一块加密.输

    出也是固定长度

    的密文。例如

    D

    Es

    密码算法的输人为

    64B

    明文,密钥长度

    56B

    密文长度“

    B

    设计分组密码算法的核心技术

    是:在相信复杂函数可以通

    过简单函数迭代若干圈得到的原则下,利用简单圈函数及对合

    等运算,

    充分利用非线性运算

    。以

    D

    Es

    算法为例

    ,它采用美国国

    家安全局精心设计的

    8

    s

    B

    0x

    P

    一置换,经过

    16

    圈迭代,最

    终产生

    64B

    密文,每圈迭代使用的鹌

    B

    子密钥是由原始的

    56B

    生的。

    采用

    D

    Es

    的一个著名的网络安全系统是

    kd

    e

    腊.由~叮开

    发,是网络通信中身份认证的工业上的事实标准。

    D

    ES(

    或其它分组密码

    )

    算法的

    使用方式有

    4

    种:电子密本、

    密码分组链接、输出反馈和密文反馈。

    D

    礴的密钥存在弱密铜,

    半弱密钥和互补密钥,选择密钥时要注意这些问题。

    DE

    s

    受到

    的最大攻击是它的密钥长度仅有

    56

    比特,强力攻击的代价低于

    1000

    万美元,

    1990

    s

    B

    i

    h

    啪和

    A

    s

    hr

    l

    if

    提出了差分攻击的方

    法,采用选择明文

    247

    攻击,最终找到可能的密钥,

    M

    M

    址嘶提出

    的线性分析方法.利用

    243

    个已知明文,成功地破译了

    16

    D

    Es

    算法,到目前为止,这是最有效的破译方法。

    基于以上弱点,人们将

    D

    Es

    算法作了多种变形,三重

    D

    Es

    式,独立子密钥

    法,可变的

    s

    B

    喊及其使用次序以及推广的

    G

    D

    Es

    等。这些改变有些是增强了密码算法的安全性,有些作用

    不大,有些还削弱了

    D

    ES

    的安全性。

    自从

    D

    展开全文
  • Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面MIME的详细规范。本文给大家分享java常用的几种加密算法,需要的朋友可以参考下
  • 常用的几种加密算法

    2020-05-07 22:49:43
    安全算法 1、数字摘要 数字摘要也被称为消息摘要。它是一个唯一对应消息或文本固定长度值。一个单向hash函数产生。如果消息在传递过程中被改变,则...2、对称加密算法 对称加密,数据发送方将原始数据与加密...

    加密算法

    1、数字摘要

    数字摘要也被称为消息摘要。它是一个唯一对应消息或文本固定长度的值。有一个单向的hash函数产生。如果消息在传递过程中被改变,则接收方按照一定规则,采用相同的hash函数重新计算后的值一定不予摘要相等。这样就可以知道消息是否被篡改。保证消息的完整性

    摘要生成过程

    Hash函数
    待摘要消息
    摘要

    摘要算法

    D5,SHA算法生成

    2、对称加密算法

    对称加密,数据发送方将原始数据与加密密钥经过一定的加密算法处理后,生成密文,接收方采用同样的加密密钥解密获得原始数据的方式。因为加密过程只有一个加密密钥,密钥的安全性等于加密的安全性。保证数据传输过程中的安全性

    对称加密过程

    密钥加密
    密钥解密
    明文
    密文
    明文

    常用的对称加密算法

    DES,3DES,AEC

    3、非对称加密

    非对称加密密钥是成对的,有公钥和私钥之分。配对使用。公钥公钥对外开放,明文采用公钥加密后,采用私钥才能解密,反之私钥加密后,采用公钥才能解密。因为加密过程采用两个不同密钥,被称为非对称加密。保证数据传输过程的安全性

    非对称加密过程

    公钥加密
    私钥解密
    明文
    密文
    明文
    展开全文
  • 本文给大家介绍php的三种常用的加密解密算法一定的参考价值,需要的朋友可以参考一下,希望对你们有所帮助。 ###php 自带的加密函数: 不可逆的加密函数为:md5()、sha1()、crypt() md5() 用来...

    php几种常用的加密解密算法

    本文给大家介绍php的三种常用的加密解密算法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

    php 自带的加密函数:

    不可逆的加密函数为:md5()、sha1()、crypt()

    1. md5() 用来计算 MD5 哈稀
    md5(string $str[,bool $raw_output=FALSE] ) :string
    

    使用:

    /**
     * md5 有两个参数:
     *  第一个参数:加密的字符串
     *  第二个参数:被设置为 TRUE则返回16字节的原始二进制格式,默认 false  以 32 字符十六进制数字形式返回散列值
     */
    $str = '123456789';
    echo '默认MD5加密的字符串为:'.md5($str)."\r\n";   //25f9e794323b453885f5181f1b624d0b
    echo '第二个参数为TRUE MD5加密的字符串为:'.md5($str,true) . "\n"; //%��2;E8��bM 
    
    1. sha1()—计算字符串的 sha1 散列值
    sha1(string $str[,bool $raw_output= false] ) :string
    

    使用:

    /**
     * sha1 有两个参数:
     *  第一个参数:加密的字符串
     *  第二个参数:被设置为 TRUE则返回20字节的原始二进制格式,默认 false  以 40 字符十六进制数字形式返回散列值
     */
    $str = '123456789';
    echo '默认sha1加密的字符串为:'.sha1($str)."\r\n";   //d0be2dc421be4fcd0172e5afceea3970e2f3d940
    echo '第二个参数为TRUE sha1加密的字符串为:'.sha1($str,true) . "\n"; //%��2;E8��bM 
    
    1. crypt() 将字符串用 UNIX 的标准加密 DES 模块加密。这是单向的加密函数,无法解密。欲比对字符串,将已加密的字符串的头二个字符放在 salt 的参数中,再比对加密后的字符串。
    crypt(string $str[,string $salt] ) :string
    

    使用:

    /**
     * crypt 有两个参数:
     *  第一个参数:加密字符串
     *  第二个参数:盐值字符串
     */
    $str = '123456789';
    // 使用自动盐值
    echo '自动 盐值: ' . crypt($str) . "\n";   // $1$yvnZHBo0$sBZBd0vzZYnxbtQftQulZ/
    //以不同散列类型使用 crypt()
    /**
     * CRYPT_STD_DES - 基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。
     * CRYPT_EXT_DES - 扩展的基于 DES 算法的散列。其盐值为 9 个字符的字符串,由 1 个下划线后面跟着 4 字节循环次数和 4 字节盐值组成。它们被编码成可打印字符,每个字符 6 位,有效位最少的优先。0 到 63 被编码为 "./0-9A-Za-z"。在盐值中使用非法的字符将导致 crypt() 失败。
     * CRYPT_MD5 - MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。
     * CRYPT_BLOWFISH - Blowfish 算法使用如下盐值:“$2a$”,一个两位 cost 参数,“$” 以及 64 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。 PHP 5.3.7 之前只支持 “$2a$” 作为盐值的前缀,PHP 5.3.7 开始引入了新的前缀来修正一个在Blowfish实现上的安全风险。可以参考» this document来了解关于这个修复的更多信息。总而言之,开发者如果仅针对 PHP 5.3.7及之后版本进行开发,那应该使用 “$2y$” 而非 “$2a$”
     * CRYPT_SHA256 - SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
     * CRYPT_SHA512 - SHA-512 算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。
     */
    echo 'CRYPT_STD_DES(标准 DES): ' . crypt($str, 'rl') . "\n";
    echo 'CRYPT_EXT_DES(扩展 DES): ' . crypt($str, '_J9..rasm') . "\n";
    echo 'CRYPT_MD5(MD5): ' . crypt($str, '$1$rasmusle$') . "\n";
    echo 'CRYPT_BLOWFISH(Blowfish): ' . crypt($str, '$2a$07$usesomesillystringforsalt$') . "\n";
    echo 'CRYPT_SHA256(SHA-256): ' . crypt($str, '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
    echo 'CRYPT_SHA512(SHA-512): ' . crypt($str, '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
    

    可逆转的加密为:base64_encode()、urlencode() 、mcrypt_encrypt()、rawurlencode()
    相对应的解密函数:base64_decode() 、urldecode() 、mcrypt_decrypt()、rawurldecode()

    1. mcrypt_encrypt()—使用给定参数加密明文
    mcrypt_encrypt(string $cipher, string $key, string $data, string $mode[, string $iv] ) :string
    

    使用:

    /**
     * mcrypt_encrypt 有两个参数:
     *  第一个参数:字符串值的算法名称 MCRYPT_RIJNDAEL_256,MCRYPT_RIJNDAEL_128,MCRYPT_RIJNDAEL_192
     *  第二个参数:加密密钥  如果密钥长度不是该算法所能够支持的有效长度,则函数将会发出警告并返回 FALSE
     *  第三个参数:加密的数据
     *  第四个参数:MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。
     *  第五个参数:iv   一般为加密的密钥
     */
    $key = 'password';  // 加密密钥
    $str = '123456789'; // 加密数据
    echo 'mcrypt_encrypt加密: ' . mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))) . "\n";
    
    1. base64_encode()—使用 MIME base64 对数据进行编码
    base64_encode (string $data):string
    

    使用:

    $str = 'This is an encoded string';
    echo base64_encode($str);
    
    1. urlencode() / rawurlencode()—编码 URL 字符串
    urlencode (string $str):string
    

    使用:

    $str = 'https://www.baidu.com';
    echo urlencode($str);
    

    自定义加密函数:

    1. 第一种自定义:
    function encryptDecrypt($key, $string, $decrypt){   
        if($decrypt){   
            $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");   
            return $decrypted;   
        }else{   
            $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));   
            return $encrypted;   
        }   
    }
    
    //加密:
    echo encryptDecrypt('password', 'Helloweba欢迎您',0); 
    
    //解密:
    echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1); 
    
    1. 第二种自定义:
    // 加密
    function lock_url($txt,$key='blog.qsjob.top'){  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $nh = rand(0,64);  
        $ch = $chars[$nh];  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = base64_encode($txt);  
        $tmp = '';  
        $i=0;$j=0;$k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;  
            $tmp .= $chars[$j];  
        }  
        return urlencode($ch.$tmp);  
    }
    // 解密
    function unlock_url($txt,$key='blog.qsjob.top'){  
        $txt = urldecode($txt);  
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";  
        $ch = $txt[0];  
        $nh = strpos($chars,$ch);  
        $mdKey = md5($key.$ch);  
        $mdKey = substr($mdKey,$nh%8, $nh%8+7);  
        $txt = substr($txt,1);  
        $tmp = '';  
        $i=0;$j=0; $k = 0;  
        for ($i=0; $i<strlen($txt); $i++) {  
            $k = $k == strlen($mdKey) ? 0 : $k;  
            $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);  
            while ($j<0) $j+=64;  
            $tmp .= $chars[$j];  
        }  
        return base64_decode($tmp);  
    } 
    
    // 加密
    echo lock_url('这是第二种自定义加密解密函数');
    //解密
    echo unlock_url(lock_url('这是第二种自定义加密解密函数'));
    
    1. 第三种自定义:
    //加密
    function passport_encrypt($txt, $key = 'blog.qsjob.top') {   
        srand((double)microtime() * 1000000);   
        $encrypt_key = md5(rand(0, 32000));   
        $ctr = 0;   
        $tmp = '';   
        for($i = 0;$i < strlen($txt); $i++) {   
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;   
        $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);   
        }   
        return urlencode(base64_encode(passport_key($tmp, $key)));   
    }  
    // 解密
    function passport_decrypt($txt, $key = 'blog.qsjob.top') {   
        $txt = passport_key(base64_decode(urldecode($txt)), $key);   
        $tmp = '';   
        for($i = 0;$i < strlen($txt); $i++) {   
        $md5 = $txt[$i];   
        $tmp .= $txt[++$i] ^ $md5;   
        }   
        return $tmp;   
    }   
    // 解析算法
    function passport_key($txt, $encrypt_key) {   
        $encrypt_key = md5($encrypt_key);   
        $ctr = 0;   
        $tmp = '';   
        for($i = 0; $i < strlen($txt); $i++) {   
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;   
        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];   
        }   
        return $tmp;   
    } 
    $txt = "1"; // 加密数据
    $key = "testkey"; //加密密钥
    //加密
    $encrypt = passport_encrypt($txt,$key); 
    echo $encrypt; 
    // 解密 
    echo passport_decrypt($encrypt,$key); 
    
    1. 第四种自定义:
    //非常给力的authcode加密函数,Discuz!经典代码(带详解)  
    //函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。  
    function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {     
        // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙     
        $ckey_length = 4;     
        // 密匙     
        $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);     
        // 密匙a会参与加解密     
        $keya = md5(substr($key, 0, 16));     
        // 密匙b会用来做数据完整性验证     
        $keyb = md5(substr($key, 16, 16));     
        // 密匙c用于变化生成的密文     
        $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';     
        // 参与运算的密匙     
        $cryptkey = $keya.md5($keya.$keyc);     
        $key_length = strlen($cryptkey);     
        // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),   
        //解密时会通过这个密匙验证数据完整性     
        // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确     
        $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :  sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;     
        $string_length = strlen($string);     
        $result = '';     
        $box = range(0, 255);     
        $rndkey = array();     
        // 产生密匙簿     
        for($i = 0; $i <= 255; $i++) {     
            $rndkey[$i] = ord($cryptkey[$i % $key_length]);     
        }     
        // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度     
        for($j = $i = 0; $i < 256; $i++) {     
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;     
            $tmp = $box[$i];     
            $box[$i] = $box[$j];     
            $box[$j] = $tmp;     
        }     
        // 核心加解密部分     
        for($a = $j = $i = 0; $i < $string_length; $i++) {     
            $a = ($a + 1) % 256;     
            $j = ($j + $box[$a]) % 256;     
            $tmp = $box[$a];     
            $box[$a] = $box[$j];     
            $box[$j] = $tmp;     
            // 从密匙簿得出密匙进行异或,再转成字符     
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));     
        }     
        if($operation == 'DECODE') {    
            // 验证数据有效性,请看未加密明文的格式     
            if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&  substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {     
                return substr($result, 26);     
            } else {     
                return '';     
            }     
        } else {     
            // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因     
            // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码     
            return $keyc.str_replace('=', '', base64_encode($result));     
        }     
    }   
    $str = 'jobhansome';   
    $key = 'blog.qsjob.top';   
    echo authcode($str,'ENCODE',$key,0); //加密   
    $str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';   
    echo authcode($str,'DECODE',$key,0); //解密 
    

    总结:以上就是这篇文章的全部内容了。

    如果有兴趣,欢迎进行探讨,我在评论区等你!!带你阅读更多优秀文章~

    展开全文
  • 内容原创本文给大家介绍php的三种常用的加密解密算法一定的参考价值,需要的朋友可以参考一下,希望对你们有所帮助。php自带的加密函数:不可逆的加密函数为:md5()、sha1()、crypt()md5()用来计算 MD5 哈稀md...

    d3f4ac3e815f4e2db566e4392de8b73f.gif

    9b2dfaf54cec1341e8e7842e3e637c0f.png

        内容原创

    本文给大家介绍php的三种常用的加密解密算法,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

    php 自带的加密函数:

    不可逆的加密函数为:md5()、sha1()、crypt()

    md5() 用来计算 MD5 哈稀

    md5(string$str[,bool$raw_output=FALSE] ) :string

    使用:

    /** * md5 有两个参数: *  第一个参数:加密的字符串 *  第二个参数:被设置为 TRUE则返回16字节的原始二进制格式,默认 false  以 32 字符十六进制数字形式返回散列值 */$str = '123456789';echo '默认MD5加密的字符串为:'.md5($str)."\r\n";   //25f9e794323b453885f5181f1b624d0becho '第二个参数为TRUE MD5加密的字符串为:'.md5($str,true) . "\n"; //%��2;E8��bM

    sha1()—计算字符串的 sha1 散列值

    sha1(string$str[,bool$raw_output= false] ) :string

    使用:

    /** * sha1 有两个参数: *  第一个参数:加密的字符串 *  第二个参数:被设置为 TRUE则返回20字节的原始二进制格式,默认 false  以 40 字符十六进制数字形式返回散列值 */$str = '123456789';echo '默认sha1加密的字符串为:'.sha1($str)."\r\n";   //d0be2dc421be4fcd0172e5afceea3970e2f3d940echo '第二个参数为TRUE sha1加密的字符串为:'.sha1($str,true) . "\n"; //%��2;E8��bM 

    crypt() 将字符串用 UNIX 的标准加密 DES 模块加密。这是单向的加密函数,无法解密。欲比

    对字符串,将已加密的字符串的头二个字符放在 salt 的参数中,再比对加密后的字符串。

    crypt(string$str[,string$salt] ) :string

    使用:

    /** * crypt 有两个参数: *  第一个参数:加密字符串 *  第二个参数:盐值字符串 */$str = '123456789';// 使用自动盐值echo '自动 盐值: ' . crypt($str) . "\n";   // $1$yvnZHBo0$sBZBd0vzZYnxbtQftQulZ///以不同散列类型使用 crypt()/** * CRYPT_STD_DES - 基于标准 DES 算法的散列使用 "./0-9A-Za-z" 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。 * CRYPT_EXT_DES - 扩展的基于 DES 算法的散列。其盐值为 9 个字符的字符串,由 1 个下划线后面跟着 4 字节循环次数和 4 字节盐值组成。它们被编码成可打印字符,每个字符 6 位,有效位最少的优先。0 到 63 被编码为 "./0-9A-Za-z"。在盐值中使用非法的字符将导致 crypt() 失败。 * CRYPT_MD5 - MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。 * CRYPT_BLOWFISH - Blowfish 算法使用如下盐值:“$2a$”,一个两位 cost 参数,“$” 以及 64 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。PHP 5.3.7 之前只支持 “$2a$” 作为盐值的前缀,PHP 5.3.7 开始引入了新的前缀来修正一个在Blowfish实现上的安全风险。可以参考» this document来了解关于这个修复的更多信息。总而言之,开发者如果仅针对 PHP 5.3.7及之后版本进行开发,那应该使用 “$2y$” 而非 “$2a$” * CRYPT_SHA256 - SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。 * CRYPT_SHA512 - SHA-512 算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。 */echo 'CRYPT_STD_DES(标准 DES): ' . crypt($str, 'rl') . "\n";echo 'CRYPT_EXT_DES(扩展 DES): ' . crypt($str, '_J9..rasm') . "\n";echo 'CRYPT_MD5(MD5): ' . crypt($str, '$1$rasmusle$') . "\n";echo 'CRYPT_BLOWFISH(Blowfish): ' . crypt($str, '$2a$07$usesomesillystringforsalt$') . "\n";echo 'CRYPT_SHA256(SHA-256): ' . crypt($str, '$5$rounds=5000$usesomesillystringforsalt$') . "\n";echo 'CRYPT_SHA512(SHA-512): ' . crypt($str, '$6$rounds=5000$usesomesillystringforsalt$') . "\n";

    可逆转的加密为:base64_encode()、urlencode() 、mcrypt_encrypt()、rawurlencode()

    相对应的解密函数:base64_decode() 、urldecode() 、mcrypt_decrypt()、rawurldecode()

    mcrypt_encrypt()—使用给定参数加密明文

    mcrypt_encrypt(string$cipher,string$key,string$data,string$mode[,string$iv] ) :string

    使用:

    /** * mcrypt_encrypt 有两个参数: *  第一个参数:字符串值的算法名称 MCRYPT_RIJNDAEL_256,MCRYPT_RIJNDAEL_128,MCRYPT_RIJNDAEL_192 *  第二个参数:加密密钥  如果密钥长度不是该算法所能够支持的有效长度,则函数将会发出警告并返回 FALSE *  第三个参数:加密的数据 *  第四个参数:MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb""cbc""cfb""ofb""nofb""stream" *  第五个参数:iv   一般为加密的密钥 */$key = 'password';  // 加密密钥$str = '123456789'; // 加密数据echo 'mcrypt_encrypt加密: ' . mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))) . "\n";

    base64_encode()—使用 MIME base64 对数据进行编码

    base64_encode ( string $data ) : string

    使用:

    $str = 'This is an encoded string';echo base64_encode($str);

    urlencode() / rawurlencode()—编码 URL 字符串

    urlencode ( string $str ) : string

    使用:

    $str = 'https://www.baidu.com';echo urlencode($str);

    自定义加密函数:

    第一种自定义:

    function encryptDecrypt($key, $string, $decrypt){       if($decrypt){           $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");           return $decrypted;       }else{           $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));           return $encrypted;       }   }//加密:echo encryptDecrypt('password', 'Helloweba欢迎您',0); //解密:echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1); 

    第二种自定义:

    // 加密function lock_url($txt,$key='blog.qsjob.top'){      $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";      $nh = rand(0,64);      $ch = $chars[$nh];      $mdKey = md5($key.$ch);      $mdKey = substr($mdKey,$nh%8, $nh%8+7);      $txt = base64_encode($txt);      $tmp = '';      $i=0;$j=0;$k = 0;      for ($i=0; $i        $k = $k == strlen($mdKey) ? 0 : $k;          $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;          $tmp .= $chars[$j];      }      return urlencode($ch.$tmp);  }// 解密function unlock_url($txt,$key='blog.qsjob.top'){      $txt = urldecode($txt);      $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";      $ch = $txt[0];      $nh = strpos($chars,$ch);      $mdKey = md5($key.$ch);      $mdKey = substr($mdKey,$nh%8, $nh%8+7);      $txt = substr($txt,1);      $tmp = '';      $i=0;$j=0; $k = 0;      for ($i=0; $i        $k = $k == strlen($mdKey) ? 0 : $k;          $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);          while ($j<0) $j+=64;          $tmp .= $chars[$j];      }      return base64_decode($tmp);  } // 加密echo lock_url('这是第二种自定义加密解密函数');//解密echo unlock_url(lock_url('这是第二种自定义加密解密函数'));

    第三种自定义:

    //加密function passport_encrypt($txt, $key = 'blog.qsjob.top') {       srand((double)microtime() * 1000000);       $encrypt_key = md5(rand(0, 32000));       $ctr = 0;       $tmp = '';       for($i = 0;$i < strlen($txt); $i++) {       $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;       $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);       }       return urlencode(base64_encode(passport_key($tmp, $key)));   }  // 解密function passport_decrypt($txt, $key = 'blog.qsjob.top') {       $txt = passport_key(base64_decode(urldecode($txt)), $key);       $tmp = '';       for($i = 0;$i < strlen($txt); $i++) {       $md5 = $txt[$i];       $tmp .= $txt[++$i] ^ $md5;       }       return $tmp;   }   // 解析算法function passport_key($txt, $encrypt_key) {       $encrypt_key = md5($encrypt_key);       $ctr = 0;       $tmp = '';       for($i = 0; $i < strlen($txt); $i++) {       $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;       $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];       }       return $tmp;   } $txt = "1"; // 加密数据$key = "testkey"; //加密密钥//加密$encrypt = passport_encrypt($txt,$key); echo $encrypt; // 解密 echo passport_decrypt($encrypt,$key); 

    第四种自定义:

    //非常给力的authcode加密函数,Discuz!经典代码(带详解)  //函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {         // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙         $ckey_length = 4;         // 密匙         $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);         // 密匙a会参与加解密         $keya = md5(substr($key, 0, 16));         // 密匙b会用来做数据完整性验证         $keyb = md5(substr($key, 16, 16));         // 密匙c用于变化生成的密文         $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';         // 参与运算的密匙         $cryptkey = $keya.md5($keya.$keyc);         $key_length = strlen($cryptkey);         // 明文,前10位用来保存时间戳,解密时验证数据有效性,1026位用来保存$keyb(密匙b),       //解密时会通过这个密匙验证数据完整性         // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确         $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :  sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;         $string_length = strlen($string);         $result = '';         $box = range(0, 255);         $rndkey = array();         // 产生密匙簿         for($i = 0; $i <= 255; $i++) {             $rndkey[$i] = ord($cryptkey[$i % $key_length]);         }         // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度         for($j = $i = 0; $i < 256; $i++) {             $j = ($j + $box[$i] + $rndkey[$i]) % 256;             $tmp = $box[$i];             $box[$i] = $box[$j];             $box[$j] = $tmp;         }         // 核心加解密部分         for($a = $j = $i = 0; $i < $string_length; $i++) {             $a = ($a + 1) % 256;             $j = ($j + $box[$a]) % 256;             $tmp = $box[$a];             $box[$a] = $box[$j];             $box[$j] = $tmp;             // 从密匙簿得出密匙进行异或,再转成字符             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));         }         if($operation == 'DECODE') {            // 验证数据有效性,请看未加密明文的格式             if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&  substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {                 return substr($result, 26);             } else {                 return '';             }         } else {             // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因             // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码             return $keyc.str_replace('=', '', base64_encode($result));         }     }   $str = 'jobhansome';   $key = 'blog.qsjob.top';   echo authcode($str,'ENCODE',$key,0); //加密   $str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';   echo authcode($str,'DECODE',$key,0); //解密

    总结:以上就是这篇文章的全部内容了。

    如果有兴趣,欢迎进行探讨,我在评论区等你!!

    a1dc3166662b2272fb036d6469fc4bad.png

    END

    53dd225f9efc23f13177988a28a2b40b.png如果你觉得文章不错可以扫码关注我们的公众号哦~带你阅读更多优秀文章~分享-点赞-在看可三连戳~
    展开全文
  • 常用加密算法

    2021-04-04 16:52:55
    这是一个常用加密算法案例,源码Secret,本APP集合了几种常用的加密信息的算法,主要运用到的控件tableview、textview以及button等. 测试环境:Xcode 6.2,iOS 6.0以上
  • 工作中时不时接触到一些加密算法md5、des、aes、对称加密、非对称加密、可逆算法、不可逆算法,那么这些算法这些概念都什么区别呢,今天闲来无事打算梳理一下。 一、什么是加密解密,加密目的是什么? ...
  • 内容原创本文给大家介绍php的三种常用的加密解密算法一定的参考价值,需要的朋友可以参考一下,希望对你们有所帮助。php自带的加密函数:不可逆的加密函数为:md5()、sha1()、crypt()md5()用来计算 MD5 哈稀md...
  • 本文给大家介绍php的三种常用的加密解密算法一定的参考价值,需要的朋友可以参考一下,希望对你们有所帮助。php 自带的加密函数:不可逆的加密函数为:md5()、sha1()、crypt()md5() 用来计算 MD5 哈稀md5使用...
  • 本文给大家介绍php的三种常用的加密解密算法一定的参考价值,需要的朋友可以参考一下,希望对你们有所帮助。php 自带的加密函数:不可逆的加密函数为:md5()、sha1()、crypt()md5() 用来计算 MD5 哈稀md5...
  • Java最常用的几种加密算法

    万次阅读 2018-11-10 11:18:46
    Base64是网络上最常见用于传输8Bit字节代码编码方式之一,大家可以查看RFC2045~RFC2049,上面MIME详细规范。Base64编码可用于在HTTP环境下传递较长标识信息。例如,在Java Persistence系统Hibernate中,...
  • Base64是网络上最常见用于传输8Bit字节代码编码方式之一,大家可以查看RFC2045~RFC2049,上面MIME详细规范。Base64编码可用于在HTTP环境下传递较长标识信息。例如,在Java Persistence系统Hibernate中,...
  • 工作中经常会接触到一些加密算法,比如说base64、MD5、DES、AES等等,那么这些算法到底什么区别以及具体应用场景是什么呢,下面就做个简要梳理。 一、什么是加/解密,目的是什么? 所谓加密,就是对原来为...
  • 几种常用加密算法比较

    千次阅读 2017-04-08 16:04:12
    前言最近在准备重构项目时候无意间发现页面一处报错:报错代码如下:injectScripts.min.js:1 Uncaught TypeError: Cannot read property 'name' of undefined at t.e._onMessage (injectScripts.min.js:1) at ...
  • 在嵌入式系统中,经常会用到版权硬件加密加速器,比较常见的有以下几种: AES: 高级加密标准(英语:AdvancedEncryptionStandard,缩写:AES),在密码学中又 称Rijndael加密法,是美国联邦政府采用一种区块...
  • 接下来小编就给大家介绍一下几种常用的Java加密算法:1. BASE64这是网络上最常见的用于传输8Bit字节代码的编码方式之一,在RFC2045~RFC204上MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息,...
  • base64是网络上最常见用于传输8bit字节代码编码方式之一(可以查看RFC2045~RFC2049,上面MIME详细规范)。base64编码可用于在http环境下传递较长标识信息,例如,在java Persistence系统Hibernate中,就...
  • 区块链底层实现离不开各种区块链加密算法,下面就给大家介绍几种常见区块链加密算法。哈希算法哈希(Hash)算法将任意长度二进制值映射为较短固定长度二进制值,这个小二进制值称为哈希值。哈希值是一段...
  • 1、base64base64是网络上最常见用于传输8bit字节代码编码方式之一(可以查看RFC2045~RFC2049,上面MIME详细规范)。base64编码可用于在http环境下传递较长标识信息,例如,在java Persistence系统Hibernate中...
  • 常见几种加密算法的Python实现

    千次阅读 2020-05-08 08:00:00
    生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现。部分常用的加密方法基本都对应的Python库,基本不再需要我们用代码实现具体算法。MD5加密全称:MD5...
  • 开发过程中常用的到的一些加密算法。   一般常用的: MD5、SHA算法:代码如下 代码已删除   调用: 代码已删除   加密前常常会转换成十六进制: 字符串转换成十六进制: ...以上的几种是比较常用的加密方法。...
  • 开发中的几种加密算法的使用场景

    千次阅读 2018-07-24 00:25:21
    数据传输过程中的加密是程序开发中避不开的一个问题。如何更科学更合理的使用加密算法也就成了一...加密算法有很多,这里只列出开发中常用的几种。 单向散列哈希算法 代表: MD5、SHA(128、256)系列 简介: ...
  • nodejs中常用加密算法

    千次阅读 2018-04-02 18:35:26
    转载:https://www.cnblogs.com/laogai/p/4664917.html在常用的nodejs+express工程中,为了安全在登录及表单传输时,应该都需进行加密传输,目前个人常用到的加密方式下列几种:1、Hash算法加密: 创建一个nodejs...
  • 部分常用的加密方法基本都对应的Python库,基本不再需要我们用代码实现具体算法。 很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,...
  •  是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两,如Android的App签名也是用的这两算法。  md5具有不可逆性,也可用来作为密码加密,并且通常情况下...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 186
精华内容 74
热门标签
关键字:

常用的加密算法有几种