常见的加密方法_php 常用加密方法 - CSDN
精华内容
参与话题
  • 常用密码加密方法

    千次阅读 2015-06-26 17:51:12
    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA的算法涉及三个参数,n...
    RSA算法
    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
    RSA的算法涉及三个参数,n、e1、e2。
    其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
    e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
    (n及e1),(n及e2)就是密钥对。
    RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;
    e1和e2可以互换使用,即:
    A=B^e2 mod n;B=A^e1 mod n;
    1.RSA非对称加密的一些非常规应用 http://www.icylife.net/yunshu/show.php?id=471
    2.RSA的解释 http://hi.baidu.com/yhgzi/blog/item/55a6b6641a4a63f5f7365431.html
    四方密码
    四方密码用4个5×5的矩阵来加密。每个矩阵都有25个字母(通常会取消Q或将I,J视作同一样,或改进为6×6的矩阵,加入10个数字)。
    首先选择两个英文字作密匙,例如example和keyword。对于每一个密匙,将重复出现的字母去除,即example要转成exampl,然后将每个字母顺序放入矩阵,再将余下的字母顺序放入矩阵,便得出加密矩阵。
    将这两个加密矩阵放在左上角和右下角,余下的两个角放a到z顺序的矩阵:
    a b c d e E X A M P
    f g h i j L B C D F
    k l m n o G H I J K
    p r s t u N O R S T
    v w x y z U V W Y Z
    K E Y W O a b c d e
    R D A B C f g h i j
    F G H I J k l m n o
    L M N P S p r s t u
    T U V X Z v w x y z
    加密的步骤:
    两个字母一组地分开讯息:(例如hello world变成he ll ow or ld)
    找出第一个字母在左上角矩阵的位置
    a b c d e E X A M P
    f g h i j L B C D F
    k l m n o G H I J K
    p r s t u N O R S T
    v w x y z U V W Y Z
    K E Y W O a b c d e
    R D A B C f g h i j
    F G H I J k l m n o
    L M N P S p r s t u
    T U V X Z v w x y z
    同样道理,找第二个字母在右下角矩阵的位置:
    a b c d e E X A M P
    f g h i j L B C D F
    k l m n o G H I J K
    p r s t u N O R S T
    v w x y z U V W Y Z
    K E Y W O a b c d e
    R D A B C f g h i j
    F G H I J k l m n o
    L M N P S p r s t u
    T U V X Z v w x y z
    找右上角矩阵中,和第一个字母同行,第二个字母同列的字母:
    a b c d e E X A M P
    f g h i j L B C D F
    k l m n o G H I J K
    p r s t u N O R S T
    v w x y z U V W Y Z
    K E Y W O a b c d e
    R D A B C f g h i j
    F G H I J k l m n o
    L M N P S p r s t u
    T U V X Z v w x y z

    找左下角矩阵中,和第一个字母同列,第二个字母同行的字母:
    a b c d e E X A M P
    f g h i j L B C D F
    k l m n o G H I J K
    p r s t u N O R S T
    v w x y z U V W Y Z
    K E Y W O a b c d e
    R D A B C f g h i j
    F G H I J k l m n o
    L M N P S p r s t u
    T U V X Z v w x y z
    这两个字母就是加密过的讯息。
    hello world的加密结果:
    he lp me ob iw an ke no bi
    FY GM KY HO BX MF KK KI MD
    [编辑]二方密码
    二方密码(en:Two-square_cipher)比四方密码用更少的矩阵。
    得出加密矩阵的方法和四方密码一样。
    例如用「example」和「keyword」作密匙,加密lp。首先找出第一个字母(L)在上方矩阵的位置,再找出第二个字母(D)在下方矩阵的位置:
    E X A M P
    L B C D F
    G H I J K
    N O R S T
    U V W Y Z
    K E Y W O
    R D A B C
    F G H I J
    L M N P S
    T U V X Z
    在上方矩阵找第一个字母同行,第二个字母同列的字母;在下方矩阵找第一个字母同列,第二个字母同行的字母,那两个字母就是加密的结果:
    E X A M P
    L B C D F
    G H I J K
    N O R S T
    U V W Y Z
    K E Y W O
    R D A B C
    F G H I J
    L M N P S
    T U V X Z
    help me的加密结果:
    he lp me
    HE DL XW
    替换加密法
    用一个字符替换另一个字符的加密方法。
    换位加密法
    重新排列明文中的字母位置的加密法。
    回转轮加密法
    一种多码加密法,它是用多个回转轮,每个回转轮实现单码加密。这些回转轮可以组合在一起,在每个字母加密后产生一种新的替换模式。
    多码加密法
    一种加密法,其替换形式是:可以用多个字母来替换明文中的一个字母。
    换位加密法
    重新排列明文中的字母位置的加密法。
    夹带法
    通过隐藏消息的存在来隐藏消息的方法。
    Kasiski法
    于19世纪由波兰的一个军官发现的,这种方法通过查看重复密文部分,来发现多码密钥的长度。
    三分密码
    首先随意制造一个3个3×3的Polybius方格替代密码,包括26个英文字母和一个符号。然后写出要加密的讯息的三维坐标。讯息和坐标四个一列排起,再顺序取横行的数字,三个一组分开,将这三个数字当成坐标,找出对应的字母,便得到密文。
    仿射密码
    仿射密码是一种替换密码。它是一个字母对一个字母的。
    它的加密函数是<math>e(x)=ax+b\pmod</math>,其中
    <math>a</math>和<math>m</math>互质。
    <math>m</math>是字母的数目。
    译码函数是<math>d(x)=a^(x-b)\pmod</math>,其中<math>a^</math>是<math>a</math>在<math>\mathbb_</math>群的乘法逆元。
    波雷费密码
    1选取一个英文字作密匙。除去重复出现的字母。将密匙的字母逐个逐个加入5×5的矩阵内,剩下的空间将未加入的英文字母依a-z的顺序加入。(将Q去除,或将I和J视作同一字。)
    2将要加密的讯息分成两个一组。若组内的字母相同,将X(或Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入X字。
    3在每组中,找出两个字母在矩阵中的地方。
    若两个字母不同行也不同列,在矩阵中找出另外两个字母,使这四个字母成为一个长方形的四个角。
    若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。
    若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。
    新找到的两个字母就是原本的两个字母加密的结果。
    RC5
    1、创建密钥组,RC5算法加密时使用了2r+2个密钥相关的的32位字: ,这里r表示加密的轮数。创建这个密钥组的过程是非常复杂的但也是直接的,首先将密钥字节拷贝到32位字的数组L中(此时要注意处理器是little-endian顺序还是big-endian顺序),如果需要,最后一个字可以用零填充。然后利用线性同余发生器模2初始化数组S:
    对于i=1到2(r+1)-1: (本应模 ,本文中令w=32)
    其中对于16位字32位分组的RC5,P=0xb7e1 Q=0x9e37
    对于32位字和64位分组的RC5,P=0xb7e15163 Q=0x9e3779b9
    对于64位字和128位分组,P=0xb7151628aed2a6b Q=0x9e3779b97f4a7c15
    最后将L与S混合,混合过程如下:
    i=j=0
    A=B=0
    处理3n次(这里n是2(r+1)和c中的最大值,其中c表示输入的密钥字的个数)
    2、加密处理,在创建完密钥组后开始进行对明文的加密,加密时,首先将明文分组划分为两个32位字:A和B(在假设处理器字节顺序是little-endian、w=32的情况下,第一个明文字节进入A的最低字节,第四个明文字节进入A的最高字节,第五个明文字节进入B的最低字节,以此类推),其中操作符<<<表示循环左移,加运算是模 (本应模 ,本文中令w=32)的。
    输出的密文是在寄存器A和B中的内容
    3、解密处理,解密也是很容易的,把密文分组划分为两个字:A和B(存储方式和加密一样),这里符合>>>是循环右移,减运算也是模 (本应模 ,本文中令w=32)的。
    ADFGVX密码
    假设我们需要发送明文讯息 "Attack at once", 用一套秘密混杂的字母表填满 Polybius 方格,像是这样:
    A D F G X
    A b t a l p
    D d h o z k
    F q f v s n
    G g j c u x
    X m r e w y
    i 和 j 视为同个字,使字母数量符合 5 × 5 格。之所以选择这五个字母,是因为它们译成摩斯密码时不容易混淆,可以降低传输错误的机率。使用这个方格,找出明文字母在这个方格的位置,再以那个字母所在的栏名称和列名称代替这个字母。可将该讯息可以转换成处理过的分解形式。
    A T T A C K A T O N C E
    AF AD AD AF GF DX AF AD DF FX GF XF
    下一步,利用一个移位钥匙加密。假设钥匙字是「CARGO」,将之写在新格子的第一列。再将上一阶段的密码文一列一列写进新方格里。
    C A R G O
    _________
    A F A D A
    D A F G F
    D X A F A
    D D F F X
    G F X F X
    最后,按照钥匙字字母顺序「ACGOR」依次抄下该字下整行讯息,形成新密文。如下:
    FAXDF ADDDG DGFFF AFAXX AFAFX
    在实际应用中,移位钥匙字通常有两打字符那么长,且分解钥匙和移位钥匙都是每天更换的。
    ADFGVX
    在 1918年 6月,再加入一个字 V 扩充。变成以 6 × 6 格共 36 个字符加密。这使得所有英文字母(不再将 I 和 J 视为同一个字)以及数字 0 到 9 都可混合使用。这次增改是因为以原来的加密法发送含有大量数字的简短信息有问题。
    希尔密码
    加密
      例如:密钥矩阵
      1 3
      0 2
      明文:HI THERE
      去空格,2个字母一组,根据字母表顺序换成矩阵数值如下,末尾的E为填充字元:
      HI TH ER EE
      8 20 5 5
      9 8 18 5
      HI 经过矩阵运算转换为 IS,具体算法参考下面的说明:
      |1 3| 8 e1*8+3*9=35 MOD26=9 =I
      |0 2| 9 e0*8+2*9=18 MOD26=18=S
      用同样的方法把“HI THERE”转换为密文“IS RPGJTJ”,注意明文中的两个E分别变为密文中的G和T。
    解密
      解密时,必须先算出密钥的逆矩阵,然后再根据加密的过程做逆运算。
      逆矩阵算法公式:
      |A B| = 1/(AD-BC) * | D -B|
      |C D| |-C A|
      例如密钥矩阵=
      |1 7|
      |0 3|
      AD-BC=1*3-0*7=3 3*X=1 mod26 所以 X=9
      因此
      |1 7| 的逆矩阵为: 9 * |3 -7|
      |0 3| |0 1|
      假设密文为“FOAOESWO”
      FO AO ES WO
       6 1 5 23
      15 15 19 15
      9* |3 -7| | 6| = 9*(3*6-7*15)=-783 mod26 = 23=W
       |0 1| |15| = 9*(0*6+1*15)= 135 mod26 = 5 =E
      所以密文“FOAOESWO”的明文为“WEREDONE”
    维吉尼亚密码
    TO BE OR NOT TO BE THAT IS THE QUESTION
    当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
    密钥:RELAT IONSR ELATI ONSRE LATIO NSREL
    明文:TOBEO RNOTT OBETH ATIST HEQUE STION
    密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY
    。埃特巴什码
    埃特巴什码是一个系统:最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。
    在罗马字母表中,它是这样出现的:

    常文:a b c d e f g h i j k l m n o p q r s t u v w x y z
    密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A


    这种密码是由熊斐特博士发现的。熊斐特博士为库姆兰《死海古卷》的最初研究者之一,他在《圣经》历史研究方面最有名气的著作是《逾越节的阴谋》。他运用这种密码来研究别人利用其他方法不能破解的那些经文。这种密码被运用在公元1世纪的艾赛尼/萨多吉/拿撒勒教派的经文中,用以隐藏姓名。其实早在公元前500年,它就被抄经人用来写作《耶利米书》〔1〕耶利米是活动在公元前627-前586年间的犹太先知,圣经旧约书中有许多关于他的记载。在他离世前,犹太领土已被巴比伦人占领。〔1〕。它也是希伯来文所用的数种密码系统之一。
    白金特、雷伊和林肯在《弥赛亚的遗产》中写道,熊斐特博士于《艾赛尼派的奥德赛》一书中描述他如何对圣殿骑士们崇拜的鲍芙默神痴迷,又如何用埃特巴什码分析这个词。令他惊奇的是,破译出的词“Sophia”为希腊语中的“智慧”。
    在希伯来语中,“Baphomet”一词拼写如下——要记住,希伯来语句必须从右向左读:
    〔 taf 〕 〔 mem 〕 〔 vav 〕 〔 pe 〕 〔 bet 〕
    将埃特巴什码用于上述字母,熊斐特博士得到如下结果:
    〔 alef 〕 〔 yud 〕 〔 pe 〕 〔 vav 〕 〔 shin 〕
    即为用希伯来语从右向左书写的希腊词“Sophia”。
    Sophia的词义不仅限于“智慧”。它还是一位女神的名字——这位女神照说应该是上帝的新娘。许多人相信,圣殿骑士们崇拜这位女神。〔1〕作者引用的是诺斯替学派的神话:“不可知解”的至尊上帝,“源化”出最早的几位亚神,最后一位就是索菲亚——“智慧”。她极求得到对上帝“神质”的“真知”——她名字第二意义的来源,而这种不合神性的欲望“孕生”了邪神,即创造宇宙的另一位“上帝”。诺斯替派将他等同于旧约中的上帝,来解释亚当夏娃堕降尘间和大洪水的事件。〔1〕
    圣殿骑士们通晓埃特巴什码的事实,强烈表明有些来自一个拿撒勒教派的人置身于圣殿骑士中间。
    丹·布朗关于英语是“最纯洁的”语言的观念可能是空想的,但并不是什么新理论。莱纳堡附近有个叫做莱纳浴泉的村庄,那里的神父亨利·布德写过一本名为《真实的凯尔特语》的书,也声称英语是一种神圣的语言,或许在“巴比伦塔”〔2〕用方舟拯救人类的诺亚,有一支后代在巴比鲁尼亚定居。他们在史纳尔平原建造高塔,试图攀登天界。恼怒的上帝分化了在此之前统一使用的语言,而交流不通引发的混乱和争执使人前功尽弃。〔2〕堕毁前就已得到使用。据说,这本书从字面上是不能理解的,它是用密码写成的,传达一个不同的信息。我们还应该记住,与其他的一些欧洲语言一样,英语的许多词汇源于拉丁。正如翠茜·特威曼在《达戈贝特复仇记》杂志中指出的那样,英语因为有26个字母,可以完美地用于埃特巴什码。其他欧洲语言所用的字母则不成偶数。此外,她始终认为郇山隐修会偏爱英语

    加密方法概况
    DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合; 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
    RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快;
    IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
    RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件快的长度也是可变的;
    DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
    AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法;
    BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
    其它算法,如XOR 、MD5、SHA1、C#、ElGamal、Deffie-Hellman、新型椭圆曲线算法ECC等。
    展开全文
  • 几种常见加密方式介绍

    万次阅读 2016-12-08 22:11:38
    在完全理解HTTPS之前,有必要弄清楚一些密码学相关的概念,比如:明文、密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书。 密码密码学中的密码(cipher)和我们日常生活中所

    密码学在计算机科学中使用非常广泛,HTTPS就是建立在密码学基础之上的一种安全的通信协议。HTTPS早在1994年由网景公司首次提出,而如今在众多互联网厂商的推广之下HTTPS已经被广泛使用在各种大小网站中。在完全理解HTTPS之前,有必要弄清楚一些密码学相关的概念,比如:明文、密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书。
    密码

    密码学中的密码(cipher)和我们日常生活中所说的密码不太一样,计算机术语『密码 cipher』是一种用于加密或者解密的算法,而我们日常所使用的『密码 password』是一种口令,它是用于认证用途的一组文本字符串,这里我们要讨论的是前者:cipher。

    密钥

    密钥是一种参数,它是在使用密码(cipher)算法过程中输入的参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个8位的密钥最多有256种情况,使用穷举法,能非常轻易的破解,知名的DES算法使用56位的密钥,目前已经不是一种安全的加密算法了,主要还是因为56位的密钥太短,在数小时内就可以被破解。密钥分为对称密钥与非对称密钥。

    明文/密文

    明文(plaintext)是加密之前的原始数据,密文是通过密码(cipher)运算后得到的结果成为密文(ciphertext)

    对称密钥

    对称密钥(Symmetric-key algorithm)又称为共享密钥加密,对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是他也有缺点,密钥需要在通讯的两端共享,让彼此知道密钥是什么对方才能正确解密,如果所有客户端都共享同一个密钥,那么这个密钥就像万能钥匙一样,可以凭借一个密钥破解所有人的密文了,如果每个客户端与服务端单独维护一个密钥,那么服务端需要管理的密钥将是成千上万,这会给服务端带来噩梦。下面就是一个简单的对称加密,将明文加密成ASCII。

    # 加密的方式:在ASCII的基础上 + 密钥的值

    def encipher(plain_text, key):  
       # 加密
    cipher_text = []
    for c in plain_text:
    cipher_text.append(str(ord(c) + key))
    return ' '.join(cipher_text)
    def decipher(cipher_text, key):
       # 解密    
    plain_text = []
    for c in cipher_text.split(" "):
    plain_text.append(chr(int(c)+key))
    return "".join(plain_text)if __name__ == '__main__':
    print "cipher_text:", encipher("abcdef", 0)
    print "plain_text:", decipher("97 98 99 100 101 102", 0)

    非对称密钥
    非对称密钥(public-key cryptography),又称为公开密钥加密,服务端会生成一对密钥,一个私钥保存在服务端,仅自己知道,另一个是公钥,公钥可以自由发布供任何人使用。客户端的明文通过公钥加密后的密文需要用私钥解密。非对称密钥在加密和解密的过程的使用的密钥是不同的密钥,加密和解密是不对称的,所以称之为非对称加密。与对称密钥加密相比,非对称加密无需在客户端和服务端之间共享密钥,只要私钥不发给任何用户,即使公钥在网上被截获,也无法被解密,仅有被窃取的公钥是没有任何用处的。常见的非对称加密有RSA,非对称加解密的过程:
    服务端生成配对的公钥和私钥
    私钥保存在服务端,公钥发送给客户端
    客户端使用公钥加密明文传输给服务端
    服务端使用私钥解密密文得到明文
    数字签名
    数据在浏览器和服务器之间传输时,有可能在传输过程中被冒充的盗贼把内容替换了,那么如何保证数据是真实服务器发送的而不被调包呢,同时如何保证传输的数据没有被人篡改呢,要解决这两个问题就必须用到数字签名,数字签名就如同日常生活的中的签名一样,一旦在合同书上落下了你的大名,从法律意义上就确定是你本人签的字儿,这是任何人都没法仿造的,因为这是你专有的手迹,任何人是造不出来的。那么在计算机中的数字签名怎么回事呢?数字签名就是用于验证传输的内容是不是真实服务器发送的数据,发送的数据有没有被篡改过,它就干这两件事,是非对称加密的一种应用场景。不过他是反过来用私钥来加密,通过与之配对的公钥来解密。
    第一步:服务端把报文经过Hash处理后生成摘要信息Digest,摘要信息使用私钥private-key加密之后就生成签名,服务器把签名连同报文一起发送给客户端。

    第二步:客户端接收到数据后,把签名提取出来用public-key解密,如果能正常的解密出来Digest2,那么就能确认是对方发的。

    第三步:客户端把报文Text提取出来做同样的Hash处理,得到的摘要信息Digest1,再与之前解密出来的Digist2对比,如果两者相等,就表示内容没有被篡改,否则内容就是被人改过了。因为只要文本内容哪怕有任何一点点改动都会Hash出一个完全不一样的摘要信息出来。

    数字证书

    数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的,为什么需要用数字证书呢,难道有了数字签名还不够安全吗?有这样一种情况,就是浏览器无法确定所有的真实服务器是不是真的是真实的,举一个简单的例子:A厂家给你们家安装锁,同时把钥匙也交给你,只要钥匙能打开锁,你就可以确定钥匙和锁是配对的,如果有人把钥匙换了或者把锁换了,你是打不开门的,你就知道肯定被窃取了,但是如果有人把锁和钥匙替换成另一套表面看起来差不多的,但质量差很多的,虽然钥匙和锁配套,但是你却不能确定这是否真的是A厂家给你的,那么这时候,你可以找质检部门来检验一下,这套锁是不是真的来自于A厂家,质检部门是权威机构,他说的话是可以被公众认可的(呵呵)。

    同样的, 因为如果有人(张三)用自己的公钥把真实服务器发送给浏览器的公钥替换了,于是张三用自己的私钥执行相同的步骤对文本Hash、数字签名,最后得到的结果都没什么问题,但事实上浏览器看到的东西却不是真实服务器给的,而是被张三从里到外(公钥到私钥)换了一通。那么如何保证你现在使用的公钥就是真实服务器发给你的呢?我们就用数字证书来解决这个问题。数字证书一般由数字证书认证机构(Certificate Authority)颁发,证书里面包含了真实服务器的公钥和网站的一些其他信息,数字证书机构用自己的私钥加密后发给浏览器,浏览器使用数字证书机构的公钥解密后得到真实服务器的公钥。这个过程是建立在被大家所认可的证书机构之上得到的公钥,所以这是一种安全的方式。

    展开全文
  • 常见的3种加密方式

    千次阅读 2018-05-21 10:03:24
    单向散列加密:根据输入长度信息进行散列计算,得到固定长度输出,常用于密码保存,常见的是MD5,SHA等,通常会加盐处理 非对称加密:加密和解密使用的是不同的秘钥,其中一个对外公开,称为公钥,另一个被称为私钥,...

    对称加密;加密和解密使用的都是同一串秘钥,例如COOKIE,通信加密,DES算法和RC算法

    单向散列加密:根据输入长度信息进行散列计算,得到固定长度输出,常用于密码保存,常见的是MD5,SHA等,通常会加盐处理

    非对称加密:加密和解密使用的是不同的秘钥,其中一个对外公开,称为公钥,另一个被称为私钥,例如RSA算法,https的数字证书

    展开全文
  • 常见加密方式

    2020-08-24 10:18:16
    本文只把我们常用加密方法进行总结。不去纠结加密的具体实现方式(密码学,太庞大了)。 常见的加密方式 常见的加密算法基本分为这几类, 线性散列算法(签名算法)MD5 SHA1 对称性加密算法 AES DES 非对称性...

    加密在我们前端的开发中也是经常遇见的。本文只把我们常用的加密方法进行总结。不去纠结加密的具体实现方式(密码学,太庞大了)。

    常见的加密方式

    常见的加密算法基本分为这几类,

    1. 线性散列算法(签名算法)MD5 SHA1
    2. 对称性加密算法 AES DES
    3. 非对称性加密算法 RSA

    Md5加密

    • MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

    • MD5加密之后产生的是一个固定长度(32位或16位)的数据

    • MD5是可以进行反向暴力破解的。也就是用很多不同的数据进行加密后跟已有的加密数据进行对比。理论上只要数据量足够庞大MD5是可以被破解的

    • MD5考虑的是破解的成本(时间和机器性能)。假设破解当前的MD5密码需要目前计算能力最优秀的计算机工作100年才能破解完成。那么当前的MD5密码就是安全的。

    • 增加破解成本的方法(方法很多,这里只说我常用的)。

      1. 使用一段无意义且随机的私匙进行MD5加密会生成一个加密串,我们暂且称之为串1
      2. 将要加密的的数据跟串1拼接,再进行一次MD5,这时会生成串2
      3. 将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据。
    • 解密。MD5不存在解密。只能把数据进行相同的MD5处理之后跟之前的的加密串进行对比。

    • 我们在注册账号时的密码一般都是用的MD5加密。

    • js中使用MD5

      多说无益直接上代码

     

      <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
      
      var hash = md5("111111"); // "96e79218965eb72c92a549dd5a330112"
    

    WX20190529-170424.png

    RSA加密

    RSA加密:RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。(这才是正经的加密算法)

    非对称加密算法:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

    • 使用时都是使用公匙加密使用私匙解密。公匙可以公开,私匙自己保留。
    • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
    • 使用场景介绍
      • 通过公匙加密,使用私匙解密。私匙是通过公匙计算生成的。假设ABC三方之间相互要进行加密通信。大家相互之间使用公匙进行信息加密,信息读取时使用各自对应的私匙进行信息解密
    • 公私匙可以通过http://web.chacuo.net/netrsakeypair在线生成
    • 用户输入的支付密码会通过RSA加密

     

        <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
        <script type="text/javascript">
            //公钥
    
            var PUBLIC_KEY = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCADB+zg4Ou3fv6rY8159gw4fkJbuMPeM41ttw20leKjSKQWOgBixHJjXbkRvoMmUQkWq67xWzpMgKB7t8LIJx+n0dLP+6YDqbfFEJJ2i1Va4U1yJyGht0bEW0tpadKX3i5JwUwQIBPiC7VSWhtVyAKtzTYeun/fqpxTDAbulrj4QIDAQAB';
            //私钥
            var PRIVATE_KEY = 'MIICWwIBAAKBgQCADB+zg4Ou3fv6rY8159gw4fkJbuMPeM41ttw20leKjSKQWOgBixHJjXbkRvoMmUQkWq67xWzpMgKB7t8LIJx+n0dLP+6YDqbfFEJJ2i1Va4U1yJyGht0bEW0tpadKX3i5JwUwQIBPiC7VSWhtVyAKtzTYeun/fqpxTDAbulrj4QIDAQABAoGACj/Y2m0orBAfvHvfrpBtc9LlX2sX/g6M7wFr6hrMdWOBBJiL5Z0PTO39D3Ow +IjcyqN+62UiUnOK04IJKiJaSa1HNWagW2aAOblca1lYyYD6wlUotMV3bgk9lly0dD0lUTd8XWOmo1NdTEFW7y1OB4pYgMcT+iv4o0cr4sAtWisCQQCD6EmjEpMI5dcfZcrSXbT+WQGvdVCjAhivVMbNYeZq37ARt+9mTnaoA6Ss/QGQ5qvO9jMhx8x9/e8EfA+AX2rzAkEA+II3IXRXY3xbjDnK84kunlWpImH6XofN2V/TGEH1/Iqa909PHhuL4mhSt0iC70/y1g5kbmXyXE5s5gEsPqmC2wJAAU9uY9NMaJs33tT5Bcvuf1RNAvwsV+Iucpdp/iJJ0qf0LMjh9Oc0oIiguyMsP886x6yEZ4J/koTSOf4tfT31ZwJAMs28I5S7QNVtic9O1FbZNvlgKG1LWAP/a08RwsXJWiWj5KdMD2WmRVT6hAnI6s+3X1d15LPmxkQqMyNOPkk9PQJAJyPGWOjrCjzwojE0lN4NtS9brx6JbPy/sFkHX5LN8Xv45+XOKp14JgRcABTfWfvnnoWoWKha2cyJFlf8AdCIuQ==';
            //使用公钥加密
            var encrypt = new JSEncrypt();
              //encrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+PRIVATE_KEY+'-----END RSA PRIVATE KEY-----');
            encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
            var encrypted = encrypt.encrypt('ceshi01');
            console.log('加密后数据:%o', encrypted);
            //使用私钥解密
            var decrypt = new JSEncrypt();
            //decrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
            decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+PRIVATE_KEY+'-----END RSA PRIVATE KEY-----');
            var uncrypted = decrypt.decrypt(encrypted);
            console.log('解密后数据:%o', uncrypted);
        </script>
    

    jsencrypt文件在小程序环境appName报错的问题

    • 原因是在小程序环境下没有浏览器环境的navigator对象和window对象
    •  

       

      解决办法修改源码,具体见下图

      WX20191106-113845.png

     

    var navigator2 = {
            appName: 'Netscape',
            userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
        };
        var window2 = {
            ASN1: null,
            Base64: null,
            Hex: null,
            crypto: null,
            href: null
        };
        let navigator = navigator2
        let window = window2
    
    

    DES/AES加密

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法

    DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

    AES这个标准用来替代原先的DES

    DES/AES我们合并在一起介绍其用法和特点

    • DES/AES是一种对称加密方式,加密运算、解密运算使用的是同样的密钥
    • 使用DES/AES进行数据交互时要求双方都拥有相同的私匙
    • 破解方法,暴力破解。DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。只要计算足够强大是可以被破解的
    • js中的使用方法

     

    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script>
      var aseKey = "12345678"     //秘钥必须为:8/16/32位
      var message = "我是一个密码";
      //加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
      var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      }).toString();
    
      console.log(encrypt); // 0Gh9NGnwOpgmB525QS0JhVJlsn5Ev9cHbABgypzhGnM
    
      //解密
      var decrypt = CryptoJS.AES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      }).toString(CryptoJS.enc.Utf8);
    
      console.log(decrypt); // 我是一个密码 
    </script>
    

    base64伪加密

    Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已(吓唬人)。

    1. base64原理
    • Base64使用A--Z,a--z,0--9,+,/ 这64个字符。
    • 将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了。
    1. js中的应用

     

    var Base64 = {
     _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
     encode: function(e) {
      var t = "";
      var n, r, i, s, o, u, a;
      var f = 0;
      e = Base64._utf8_encode(e);
      while (f < e.length) {
       n = e.charCodeAt(f++);
       r = e.charCodeAt(f++);
       i = e.charCodeAt(f++);
       s = n >> 2;
       o = (n & 3) << 4 | r >> 4;
       u = (r & 15) << 2 | i >> 6;
       a = i & 63;
       if (isNaN(r)) {
        u = a = 64
       } else if (isNaN(i)) {
        a = 64
       }
       t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
      }
      return t
     },
     decode: function(e) {
      var t = "";
      var n, r, i;
      var s, o, u, a;
      var f = 0;
      e=e.replace(/[^A-Za-z0-9+/=]/g,"");
      while (f < e.length) {
       s = this._keyStr.indexOf(e.charAt(f++));
       o = this._keyStr.indexOf(e.charAt(f++));
       u = this._keyStr.indexOf(e.charAt(f++));
       a = this._keyStr.indexOf(e.charAt(f++));
       n = s << 2 | o >> 4;
       r = (o & 15) << 4 | u >> 2;
       i = (u & 3) << 6 | a;
       t = t + String.fromCharCode(n);
       if (u != 64) {
        t = t + String.fromCharCode(r)
       }
       if (a != 64) {
        t = t + String.fromCharCode(i)
       }
      }
      t = Base64._utf8_decode(t);
      return t
     }
    }
    // 定义字符串
    var string = 'Hello World!';
    // 加密
    var encodedString = Base64.encode(string);
    console.log(encodedString); // 输出: "SGVsbG8gV29ybGQh"
    // 解密
    var decodedString = Base64.decode(encodedString);
    console.log(decodedString); // 输出: "Hello World!"




    链接:https://www.jianshu.com/p/95d8eeb8301f
    来源:简书

    展开全文
  • 常见的几种加密方法和实现

    千次阅读 2018-11-27 16:09:40
    常见的几种加密方法
  • 浅谈常见的七种加密算法及实现

    万次阅读 多人点赞 2018-09-10 18:38:26
    前言 数字签名、信息加密 是前后端开发都...这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。 正文 1. 数字签名 数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 ...
  • 数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。 一、加密的基本概念  "加密",是...
  • 几种常用的文件加密方法

    千次阅读 2009-11-20 10:46:00
    下文是中软通用产品研发中心陈尚义根据http://blog.sina.com.cn/s/blog_611c36a80100gch7.html?tj=1编译. 每个人的电脑硬盘中都会...一种是防止家人或朋友使用我的电脑时无意看到;另一种是在上网的时候,这些信息很容
  • 常用加密方法及破解思路

    千次阅读 2016-11-11 11:40:53
    2、使用对称加密算法来保存数据,比如DES、3DES、AES、RC2、RC4、RC5和Blowfish等算法。加解密使用相同的秘钥。==》获取密钥破解3、使用非对称加密算法来保存数据,比如MD5、SHA1等单向HASH算法,使用这些算法后,...
  • iOS开发-iOS加密iOS常用加密方法三种

    千次阅读 2015-12-21 11:00:48
    常用的是MD5加密,这是一种单向加密,实现如下: 需要添加的类库: #import #import #import #include MD5实现方法(16位): + (NSString *)md5:(NSString *)str { constchar *concat_str = [strU
  • Java中常用加密方法(JDK)

    千次阅读 2015-12-22 11:37:07
    大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些资料将加密直接分为对称加密和非对称加密)。 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。而单向加密只是对信息...
  • 博文链接:https://llying.iteye.com/blog/171256
  • 常见加密类型及通信安全

    万次阅读 2016-11-05 22:13:24
    单向加密 1 特征 2 常见算法 3 满足哪些安全特性 对称加密 1 特征 2 常见算法 3 满足哪些安全特性 IKE 1 秘钥交换过程 2 特征 非对称加密算法 1 特征 2 身份认证 3 常见算法 4 满足哪些安全特性 5 引入的问题 ...
  • 常用加密方式

    千次阅读 2019-01-24 17:41:53
    对称加密、单向加密、base64、AES、DES、SHA、MD5、RSA
  • 作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密或者加密方式比较弱,导致黑客可以还原出原始的用户密码。目前已经曝光的信息...
  • 加密方法 目标 攻击方法 攻击复杂度 移位密码 密文/密钥 穷举攻击 26 仿射密码 密文/密钥 穷举攻击 12*26 单表代换密码 密文/密钥 穷举攻击 26! 维吉尼亚密码 密钥...
  • js常用的几种简单的加密方式

    千次阅读 2019-08-13 17:32:17
    1,escape()和unescape(),js自带的方法进行编码和解码字符串 var a=escape("你好");//编码 var unescape1 = unescape(a);// 解码 2.md5加密--但是此加密是不可逆的--如果进行对比都进行 加密对比 用的时候...
  • Java中常用加密与解密方法

    千次阅读 2019-06-14 15:37:50
    大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些资料将加密直接分为对称加密和非对称加密)。 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。而单向加密只是对信息...
  • 大体上分为双向加密和单向加密 ,而双向加密又分为对称加密和非对称加密 (有些资料将加密直接分为对称加密和非对称加密)。 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。而单向加密只是对信息...
  • java常用加密解密方法

    万次阅读 2014-03-19 19:51:46
    加密是指对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,通过这样的途径来达到保护数据不...采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加
1 2 3 4 5 ... 20
收藏数 268,708
精华内容 107,483
关键字:

常见的加密方法