① aes128绠楁硶 瀵嗘枃鍜屾槑鏂囧备綍绠楀嚭瀵嗙爜
AES-128鏄涓绉嶅圭О锷犲瘑绠楁硶锛屼娇鐢ㄧ浉钖岀殑瀵嗛挜杩涜屽姞瀵嗗拰瑙e瘑銆傚瘑阍ラ暱搴︿负128浣嶏纸16瀛楄妭锛夛纴瀵嗛挜鍙浠ユ槸闅忔満鐢熸垚镄勚
瑕佽$畻鍑哄瘑镰侊纸鍗冲瘑鏂囧拰鏄庢枃涔嬮棿镄勮浆鎹锛夛纴闇瑕佷互涓嬫ラわ细
1. 瀵嗛挜鐢熸垚锛氶栧厛锛岄渶瑕佺敓鎴愪竴涓128浣岖殑瀵嗛挜銆傚瘑阍ュ彲浠ユ槸闅忔満鐢熸垚镄勶纴涔熷彲浠ヤ娇鐢ㄥ瘑镰佸﹀畨鍏ㄧ殑浼闅忔満鏁扮敓鎴愬櫒鐢熸垚銆
2. 鍒嗙粍鍜屽~鍏咃细灏嗘槑鏂囧垎鎴愬浐瀹氶暱搴︾殑鍧楋纸阃氩父涓128浣嶏级銆傚傛灉鏄庢枃镄勯暱搴︿笉鏄鍧楅暱搴︾殑鏁存暟鍊嶏纴闇瑕佽繘琛屽~鍏咃纴浠ユ弧瓒冲潡闀垮害镄勮佹眰銆
3. 鍒濆嬭疆瀵嗛挜锷狅细灏嗙敓鎴愮殑瀵嗛挜涓庣涓涓瀵嗘枃鍧楄繘琛屽纾鎴栨搷浣溿
4. 杞鍑芥暟锛欰ES绠楁硶涓浣跨敤浜嗕竴绯诲垪镄勮疆鍑芥暟锛屽寘𨰾瀛楄妭浠f崲锛圫ubBytes锛夈佽屼綅绉伙纸ShiftRows锛夈佸垪娣锋穯锛圡ixColumns锛夊拰杞瀵嗛挜锷狅纸AddRoundKey锛夌瓑镎崭綔銆傝繖浜涙搷浣滃湪姣忎竴杞涓閮戒细琚搴旂敤鍒板瘑鏂囧潡涓娿
5. 杞鏁板惊鐜锛氭牴鎹瓵ES绠楁硶镄勮勫畾锛屾牴鎹瀵嗛挜闀垮害纭瀹氩姞瀵呜疆鏁般傛疮涓杞涓閮戒细瀵瑰瘑鏂囧潡杩涜屼竴绯诲垪镄勮疆鍑芥暟镎崭綔銆
6. 链钖庝竴杞锛氩湪链钖庝竴杞涓锛屼笉浼氭墽琛屽垪娣锋穯锛圡ixColumns锛夋搷浣溿
7. 瀵嗘枃鐢熸垚锛氱粡杩囨墍链夎疆鏁扮殑澶勭悊钖庯纴链钖庡缑鍒扮殑瀵嗘枃鍗充负锷犲瘑钖庣殑缁撴灉銆
瑙e瘑杩囩▼涓庡姞瀵呜繃绋嬬浉浼硷纴鍙鏄鍦ㄨ疆瀵嗛挜锷狅纸AddRoundKey锛夋ラや腑浣跨敤镄勬槸阃嗗瘑阍ワ纴浠ラ嗗簭杩涜岃В瀵嗘搷浣溿
闇瑕佹敞镒忕殑鏄锛屽姞瀵嗗拰瑙e瘑浣跨敤鐩稿悓镄勫瘑阍ワ纴锲犳ゅ湪杩涜屾暟鎹浼犺緭镞讹纴闇瑕佺‘淇濆瘑阍ョ殑瀹夊叏镐э纴浠ュ厤琚链鎺堟潈镄勪汉銮峰缑瀵嗛挜骞惰В瀵嗘暟鎹銆
② RSA加密填充方式
RSA加密常用的填充方式有下面3种:
1.RSA_PKCS1_PADDING 填充模式,最常用的模式
要求:
输入:必须 比 RSA 钥模长(molus) 短至少11个字节, 也就是RSA_size(rsa) – 11。如果输入的明文过长,必须切割,然后填充
输出:和molus一样长
根据这个要求,对于512bit的密钥,block length = 512/8 – 11 = 53 字节
2.RSA_PKCS1_OAEP_PADDING
输入:RSA_size(rsa) – 41
输出:和molus一样长
3.for RSA_NO_PADDING不填充
输入:可以和RSA钥模长一样长,如果输入的明文过长,必须切割,然后填充
输出:和molus一样长
跟DES,AES一样,RSA也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。但跟AES等不同的是,block length是跟key length有关的。每次RSA加密的明文的长度是受RSA填充模式限制的,但是RSA每次加密的块长度就是key length。
需要注意:
假如你选择的秘钥长度为1024bit共128个byte:
1.当你在客户端选择RSA_NO_PADDING填充模式时,如果你的明文不够128字节加密的时候会在你的明文前面,前向的填充零。解密后的明文也会包括前面填充的零,这是服务器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明文。
2.当你选择RSA_PKCS1_PADDING填充模式时,如果你的明文不够128字节加密的时候会在你的明文中随机填充一些数据,所以会导致对同样的明文每次加密后的结果都不一样。对加密后的密文,服务器使用相同的填充方式都能解密。解密后的明文也就是之前加密的明文。
3.RSA_PKCS1_OAEP_PADDING填充模式没有使用过, 他是PKCS#1推出的新的填充方式,安全性是最高的,和前面RSA_PKCS1_PADDING的区别就是加密前的编码方式不一样。
Java默认RSA实现
一个优秀的加密必须每次生成的密文都不一致,即使每次你的明文一样、使用同一个公钥。因为这样才能把明文信息更安全地隐藏起来。
Java 默认的 RSA 实现是 "RSA/None/PKCS1Padding"(比如 Cipher cipher = Cipher.getInstance("RSA");句,这个 Cipher 生成的密文总是不一致的),Bouncy Castle 的默认 RSA 实现是 "RSA/None/NoPadding"。
为什么 Java 默认的 RSA 实现每次生成的密文都不一致呢,即使每次使用同一个明文、同一个公钥?这是因为 RSA 的 PKCS #1 padding 方案在加密前对明文信息进行了随机数填充。
你可以使用以下办法让同一个明文、同一个公钥每次生成同一个密文,但是你必须意识到你这么做付出的代价是什么。比如,你可能使用 RSA 来加密传输,但是由于你的同一明文每次生成的同一密文,攻击者能够据此识别到同一个信息都是何时被发送。
③ 甯歌佺殑缂栫爜鍜屽姞瀵嗙畻娉
甯歌佺殑缂栫爜鍜屽姞瀵嗙畻娉曟湁锛欰SCII缂栫爜銆乥ase瀹舵棌缂栫爜銆
1銆丄SCII缂栫爜
ASCII镰佹槸瀵硅嫳璇瀛楃︿笌浜岃繘鍒朵綅涔嬮棿镄勫叧绯伙纴锅氢简缁熶竴瑙勫畾銆傚熀链镄𪞝SCII瀛楃﹂泦鍏辨湁128涓瀛楃︼纴鍏朵腑链96涓鍙镓揿嵃瀛楃︼纴鍖呮嫭甯哥敤镄勫瓧姣嶃佹暟瀛椼佹爣镣圭﹀彿绛夈
濡傦细绌烘牸SPACE鏄32锛堜簩杩涘埗锛00100000锛夛绂鏁板瓧0鏄48锛堜簩杩涘埗锛00110000锛夛绂澶у啓瀛楁瘝A鏄65锛堜簩杩涘埗锛01000001锛夈傚彟澶栬缮链32涓鎺у埗瀛楃︼纸涓嶈兘镓揿嵃鍑烘潵锛夈傝繖128涓绗﹀彿锛屽彧鍗犵敤浜嗕竴涓瀛楄妭镄勫悗闱7浣嶏纴链鍓嶉溃镄勪竴浣岖粺涓瑙勫畾涓0銆
2銆丅ase64缂栫爜
Base16缂栫爜鏄灏嗕簩杩涘埗鏂囦欢杞鎹㈡垚鐢16涓瀛楃︾粍鎴愮殑鏂囨湰锛宐ase32镄勭紪镰佽〃鏄鐢盇-Z銆2-7锛32涓鍙瑙佸瓧绗︽瀯鎴愶纴钬=钬濈﹀彿鐢ㄤ綔钖庣紑濉鍏呫
base64镄勭紪镰佽〃鏄鐢盇-Z銆乤-z銆0-9銆+銆/64涓鍙瑙佸瓧绗︽瀯鎴愶纴钬=钬濈﹀彿鐢ㄤ綔钖庣紑濉鍏呫侠ase58镄勭紪镰佽〃鐩告瘆base64灏戜简鏁板瓧0锛屽ぇ鍐椤瓧姣岻锛孙锛屽皬鍐椤瓧姣峫锛屼互鍙婄﹀彿钬+钬椤拰钬/钬欍
base91镄勫瘑鏂囩敱91涓瀛楃0-9锛宎-z锛孉-Z,!#$%&()*+,./:;<=>?@[]^_`{|}~钬濈粍鎴愶纴Base100缂栫爜/瑙g爜宸ュ叿鍙埚悕锛欵moji琛ㄦ儏绗﹀彿缂栫爜/瑙g爜锛屽彲灏嗘枃链鍐呭圭紪镰佷负Emoji琛ㄦ儏绗﹀彿锛涘悓镞朵篃鍙浠ュ皢缂栫爜钖庣殑Emoji琛ㄦ儏绗﹀彿鍐呭硅В镰佷负鏂囨湰銆
瀛楄妭镰佽浆鏂囨湰镄勭紪镰佹柟寮忥细
鍦ㄨ$畻链轰腑锛屾棤璁烘槸鍐呭瓨銆佺佺洏銆佺绣缁滀紶杈掳纴娑夊强鍒扮殑鏁版嵁閮芥槸浠ヤ簩杩涘埗镙煎纺𨱒ュ瓨鍌ㄦ垨浼犺緭镄勚傛疮涓涓浜岃繘鍒朵綅锛坆it锛夊彧鑳芥槸0鎴1銆备簩杩涘埗浣崭笉浼氩崟镫瀛桦湪锛岃屾槸浠8涓浜岃繘鍒朵綅缁勬垚1涓瀛楄妭锛坆yte锛夌殑鏂瑰纺瀛桦湪锛屽嵆1byte=8 bit銆
瀛楄妭镰佹棤娉旷洿鎺ヨ浆涓哄彲镓揿嵃镄勬枃链瀛楃︼纴链夋椂𨱍抽氲繃鏂囨湰鏂瑰纺閰岖疆銆佸瓨鍌ㄣ佷紶杈扑竴娈典簩杩涘埗瀛楄妭镰侊纴姣斿傞厤缃鏂囦欢銆丠TML/XML銆乁RL銆乪-mail姝f枃銆丠TTP Header绛変粎鏀鎸佹枃链镄勫満鏅涓嬶纴灏遍渶瑕佸皢浜岃繘鍒跺瓧鑺傜爜杞涓烘枃链瀛楃︿覆銆
浜岃繘鍒跺瓧鑺傜爜杞鏂囨湰瀛楃︽湁寰埚氱嶆柟寮忥纴链绠鍗旷殑鏂瑰纺鏄鐩存帴鐢0鍜1𨱒ヨ〃绀恒备絾鏄杩欐牱镄勮瘽锛8涓0/1瀛楃︽墠鑳借〃绀1涓瀛楄妭锛岄暱搴﹀お闀垮緢涓嶆柟渚裤
浠ヤ笂鍐呭瑰弬钥冿细锏惧害锏剧-ASCII
④ aes算法是什么
AES:Advanced Encryption Standard(高级加密标准),是美国国家标准与技术研究所用于加密电子数据的规范,该算法汇聚了设计简单、密钥安装快、需要的内存空间少、在所有的平台上运行良好、支持并行处理并且可以抵抗所有已知攻击等优点。
AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。
AES具有应用范围广
等待时间短、相对容易隐藏、吞吐量高等优点,在性能等各方面都优于WEP算法。利用此算法加密,WLAN的安全性将会获得大幅度提高。AES算法已经在802.11i标准中得到最终确认,成为取代WEP的新一代的加密算法。但是由于AES算法对硬件要求比较高,因此AES无法通过在原有设备上升级固件实现,必须重新设计芯片。
以上内容参考:网络-AES技术
⑤ 常用的加密算法有哪些
对称密钥加密
对称密钥加密 Symmetric Key Algorithm 又称为对称加密、私钥加密、共享密钥加密:这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单的相互推算的密钥,对称加密的速度一般都很快。
分组密码
分组密码 Block Cipher 又称为“分块加密”或“块加密”,将明文分成多个等长的模块,使用确定的算法和对称密钥对每组分别加密解密。这也就意味着分组密码的一个优点在于可以实现同步加密,因为各分组间可以相对独立。
与此相对应的是流密码:利用密钥由密钥流发生器产生密钥流,对明文串进行加密。与分组密码的不同之处在于加密输出的结果不仅与单独明文相关,而是与一组明文相关。
DES、3DES
数据加密标准 DES Data Encryption Standard 是由IBM在美国国家安全局NSA授权下研制的一种使用56位密钥的分组密码算法,并于1977年被美国国家标准局NBS公布成为美国商用加密标准。但是因为DES固定的密钥长度,渐渐不再符合在开放式网络中的安全要求,已经于1998年被移出商用加密标准,被更安全的AES标准替代。
DES使用的Feistel Network网络属于对称的密码结构,对信息的加密和解密的过程极为相似或趋同,使得相应的编码量和线路传输的要求也减半。
DES是块加密算法,将消息分成64位,即16个十六进制数为一组进行加密,加密后返回相同大小的密码块,这样,从数学上来说,64位0或1组合,就有2^64种可能排列。DES密钥的长度同样为64位,但在加密算法中,每逢第8位,相应位会被用于奇偶校验而被算法丢弃,所以DES的密钥强度实为56位。
3DES Triple DES,使用不同Key重复三次DES加密,加密强度更高,当然速度也就相应的降低。
AES
高级加密标准 AES Advanced Encryption Standard 为新一代数据加密标准,速度快,安全级别高。由美国国家标准技术研究所NIST选取Rijndael于2000年成为新一代的数据加密标准。
AES的区块长度固定为128位,密钥长度可以是128位、192位或256位。AES算法基于Substitution Permutation Network代换置列网络,将明文块和密钥块作为输入,并通过交错的若干轮代换"Substitution"和置换"Permutation"操作产生密文块。
AES加密过程是在一个4*4的字节矩阵(或称为体State)上运作,初始值为一个明文区块,其中一个元素大小就是明文区块中的一个Byte,加密时,基本上各轮加密循环均包含这四个步骤:
ECC
ECC即 Elliptic Curve Cryptography 椭圆曲线密码学,是基于椭圆曲线数学建立公开密钥加密的算法。ECC的主要优势是在提供相当的安全等级情况下,密钥长度更小。
ECC的原理是根据有限域上的椭圆曲线上的点群中的离散对数问题ECDLP,而ECDLP是比因式分解问题更难的问题,是指数级的难度。而ECDLP定义为:给定素数p和椭圆曲线E,对Q=kP,在已知P,Q 的情况下求出小于p的正整数k。可以证明由k和P计算Q比较容易,而由Q和P计算k则比较困难。
数字签名
数字签名 Digital Signature 又称公钥数字签名是一种用来确保数字消息或文档真实性的数学方案。一个有效的数字签名需要给接收者充足的理由来信任消息的可靠来源,而发送者也无法否认这个签名,并且这个消息在传输过程中确保没有发生变动。
数字签名的原理在于利用公钥加密技术,签名者将消息用私钥加密,然后公布公钥,验证者就使用这个公钥将加密信息解密并对比消息。一般而言,会使用消息的散列值来作为签名对象。
⑥ 十大常见密码加密方式
一、密钥散列
采用MD5或者SHA1等散列算法,对明文进行加密。严格来说,MD5不算一种加密算法,而是一种摘要算法。无论多长的输入,MD5都会输出一个128位(16字节)的散列值。而SHA1也是流行的消息摘要算法,它可以生成一个被称为消息摘要的160位(20字节)散列值。MD5相对SHA1来说,安全性较低,但是速度快;SHA1和MD5相比安全性高,但是速度慢。
二、对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密。对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。
三、非对称加密
非对称加密算法是一种密钥的保密方法,它需要两个密钥来进行加密和解密,这两个密钥是公开密钥和私有密钥。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。非对称加密算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
四、数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。
五、直接明文保存
早期很多这样的做法,比如用户设置的密码是“123”,直接就将“123”保存到数据库中,这种是最简单的保存方式,也是最不安全的方式。但实际上不少互联网公司,都可能采取的是这种方式。
六、使用MD5、SHA1等单向HASH算法保护密码
使用这些算法后,无法通过计算还原出原始密码,而且实现比较简单,因此很多互联网公司都采用这种方式保存用户密码,曾经这种方式也是比较安全的方式,但随着彩虹表技术的兴起,可以建立彩虹表进行查表破解,目前这种方式已经很不安全了。
七、特殊的单向HASH算法
由于单向HASH算法在保护密码方面不再安全,于是有些公司在单向HASH算法基础上进行了加盐、多次HASH等扩展,这些方式可以在一定程度上增加破解难度,对于加了“固定盐”的HASH算法,需要保护“盐”不能泄露,这就会遇到“保护对称密钥”一样的问题,一旦“盐”泄露,根据“盐”重新建立彩虹表可以进行破解,对于多次HASH,也只是增加了破解的时间,并没有本质上的提升。
八、PBKDF2
该算法原理大致相当于在HASH算法基础上增加随机盐,并进行多次HASH运算,随机盐使得彩虹表的建表难度大幅增加,而多次HASH也使得建表和破解的难度都大幅增加。
九、BCrypt
BCrypt 在1999年就产生了,并且在对抗 GPU/ASIC 方面要优于 PBKDF2,但是我还是不建议你在新系统中使用它,因为它在离线破解的威胁模型分析中表现并不突出。
十、SCrypt
SCrypt 在如今是一个更好的选择:比 BCrypt设计得更好(尤其是关于内存方面)并且已经在该领域工作了 10 年。另一方面,它也被用于许多加密货币,并且我们有一些硬件(包括 FPGA 和 ASIC)能实现它。 尽管它们专门用于采矿,也可以将其重新用于破解。
⑦ 加密技术06-加密总结
对称密码是一种用相同的密钥进行加密和解密的技术,用于确保消息的机密性。在对称密码的算法方面,目前主要使用的是 AES。尽管对称密码能够确保消息的机密性,但需要解决将解密密钥配送给接受者的密钥配送问题。
主要算法
DES
数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。
DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。
原理请参考: 加密技术01-对称加密-DES原理
3DES
三重数据加密算法(英语:Triple Data Encryption Algorithm,缩写为TDEA,Triple DEA),或称3DES(Triple DES),是一种对称密钥加密块密码,相当于是对每个数据块应用三次DES算法。由于计算机运算能力的增强,原版DES由于密钥长度过低容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
注意:有3个独立密钥的3DES的密钥安全性为168位,但由于中途相遇攻击(知道明文和密文),它的有效安全性仅为112位。
3DES使用“密钥包”,其包含3个DES密钥,K1,K2和K3,均为56位(除去奇偶校验位)。
密文 = E k3 (D k2 (E k1 (明文)))
而解密则为其反过程:
明文 = D k3 (E k2 (D k1 (密文)))
AES
AES 全称 Advanced Encryption Standard(高级加密标准)。它的出现主要是为了取代 DES 加密算法的,因为 DES 算法的密钥长度是 56 位,因此算法的理论安全强度是 56 位。于是 1997 年 1 月 2 号,美国国家标准技术研究所宣布什望征集高级加密标准,用以取代 DES。AES 也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6 和 MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael 算法获胜。
AES 密码与分组密码 Rijndael 基本上完全一致,Rijndael 分组大小和密钥大小都可以为 128 位、192 位和 256 位。然而 AES 只要求分组大小为 128 位,因此只有分组长度为 128 位的 Rijndael 才称为 AES 算法。
本文 AES 默认是分组长度为 128 位的 Rijndael 算法
原理请参考: 加密技术02-对称加密-AES原理
算法对比
公钥密码是一种用不同的密钥进行加密和解密的技术,和对称密码一样用于确保消息的机密性。使用最广泛的一种公钥密码算法是 RAS。和对称密码相比,公钥密码的速度非常慢,因此一般都会和对称密码一起组成混合密码系统来使用。公钥密码能够解决对称密码中的密钥交换问题,但存在通过中间人攻击被伪装的风险,因此需要对带有数字签名的公钥进行认证。
公钥密码学的概念是为了解决对称密码学中最困难的两个问题而提出
应用场景
几个误解
主要算法
Diffie–Hellman 密钥交换
迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为D-H) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。公钥交换的概念最早由瑞夫·墨克(Ralph C. Merkle)提出,而这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表,也是在公开文献中发布的第一个非对称方案。
Diffie–Hellman 算法的有效性是建立在计算离散对数很困难的基础上。简单地说,我们可如下定义离散对数。首先定义素数 p 的本原跟。素数 p 的本原根是一个整数,且其幂可以产生 1 到 p-1 之间所有整数,也就是说若 a 是素数 p 的本原根,则
a mod p, a 2 mod p,..., a p-1 mod p 各不相同,它是整数 1 到 p-1 的一个置换。
对任意整数 b 和素数 p 的本原跟 a,我们可以找到唯一的指数 i 使得
b ≡ a i (mod p) 其中 0 <= i <= p-1
其中 a, b, p 这些是公开的,i 是私有的,破解难度就是计算 i 的难度。
Elgamal
1985年,T.Elgamal 提出了一种基于离散对数的公开密钥体制,一种与 Diffie-Hellman 密钥分配体制密切相关。Elgamal 密码体系应用于一些技术标准中,如数字签名标准(DSS) 和 S/MIME 电子邮件标准。
基本原理就是利用 Diffie–Hellman 进行密钥交换,假设交换的密钥为 K,然后用 K 对要发送的消息 M,进行加密处理。
所以 Elgamal 的安全系数取决于 Diffie–Hellman 密钥交换。
另外 Elgamal 加密后消息发送的长度会增加一倍。
RSA
MIT 的罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在 1977 年提出并于 1978 年首次发表的算法。RSA 是最早满足要求的公钥算法之一,自诞生日起就成为被广泛接受且被实现的通用的公钥加密方法。
RSA 算法的有效性主要依据是大数因式分解是很困难的。
原理请参考: 加密技术03-非对称加密-RSA原理
ECC
大多数使用公钥密码学进行加密和数字签名的产品和标准都使用 RSA 算法。我们知道,为了保证 RSA 使用的安全性,最近这些年来密钥的位数一直在增加,这对使用 RSA 的应用是很重的负担,对进行大量安全交易的电子商务更是如此。近来,出现的一种具有强大竞争力的椭圆曲线密码学(ECC)对 RSA 提出了挑战。在标准化过程中,如关于公钥密码学的 IEEE P1363 标准中,人们也已考虑了 ECC。
与 RSA 相比,ECC 的主要诱人之处在于,它可以使用比 RSA 短得多的密钥得到相同安全性,因此可以减少处理负荷。
ECC 比 RSA 或 Diffie-Hellman 原理复杂很多,本文就不多阐述了。
算法对比
公钥密码体制的应用
密码分析所需计算量( NIST SP-800-57 )
注:L=公钥的大小,N=私钥的大小
散列函数是一种将长消息转换为短散列值的技术,用于确保消息的完整性。在散列算法方面,SHA-1 曾被广泛使用,但由于人们已经发现了一些针对该算法理论上可行的攻击方式,因此该算法不应再被用于新的用途。今后我们应该主要使用的算法包括目前已经在广泛使用的 SHA-2,以及具有全新结构的 SHA-3 算法。散列函数可以单独使用,也可以作为消息认证、数字签名以及伪随机数生成器等技术的组成元素来使用。
主要应用
主要算法
MD5
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位( 16 字节,被表示为 32 位十六进制数字)的散列值(hash value),用于确保信息传输完整一致。MD5 由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于 1992 年公开,用以取代 MD4 算法。这套算法的程序在 RFC 1321 中被加以规范。
2009年,中国科学院的谢涛和冯登国仅用了 2 20.96 的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。2011年,RFC 6151 禁止MD5用作密钥散列消息认证码。
原理请参考: 加密技术04-哈希算法-MD5原理
SHA-1
SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用SHA-2或SHA-3来替换SHA-1。Microsoft、Google以及Mozilla都宣布,它们旗下的浏览器将在2017年停止接受使用SHA-1算法签名的SSL证书。
2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA-1散列值相同的PDF文件作为概念证明。
2020年,针对SHA-1的选择前缀冲突攻击已经实际可行。建议尽可能用SHA-2或SHA-3取代SHA-1。
原理请参考: 加密技术05-哈希算法-SHA系列原理
SHA-2
SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布。属于SHA算法之一,是SHA-1的后继者。其下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
SHA-2 系列的算法主要思路和 SHA-1 基本一致
原理请参考: 加密技术05-哈希算法-SHA系列原理
SHA-3
SHA-3 第三代安全散列算法(Secure Hash Algorithm 3),之前名为 Keccak 算法。
Keccak 是一个加密散列算法,由 Guido Bertoni,Joan Daemen,Michaël Peeters,以及 Gilles Van Assche 在 RadioGatún 上设计。
2012年10月2日,Keccak 被选为 NIST 散列函数竞赛的胜利者。SHA-2 目前没有出现明显的弱点。由于对 MD5、SHA-0 和 SHA-1 出现成功的破解,NIST 感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的 SHA-3。
SHA-3 在2015年8月5日由 NIST 通过 FIPS 202 正式发表。
原理请参考: 加密技术05-哈希算法-SHA系列原理
算法对比
⑧ 开发中常见的加密方式及应用
开发中常见的加密方式及应用
一、base64
简述:Base64是网络上最常见的用于传输8Bit 字节码 的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。所有的数据都能被编码为并只用65个字符就能表示的文本文件。( 65字符:A~Z a~z 0~9 + / = )编码后的数据~=编码前数据的4/3,会大1/3左右(图片转化为base64格式会比原图大一些)。
应用:Base64编码是从二进制到字符的过程,可用于在 HTTP 环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一 标识符 (一般为128-bit的UUID)编码为一个字符串,用作HTTP 表单 和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制 数据编码 为适合放在URL(包括隐藏 表单域 )中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
命令行进行Base64编码和解码
编码:base64 123.png -o 123.txt
解码:base64 123.txt -o test.png -D Base64编码的原理
原理:
1)将所有字符转化为ASCII码;
2)将ASCII码转化为8位二进制;
3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
Base64编码的说明:
a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
b.数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c.不断进行,直到全部输入数据转换完成。
d.如果最后剩下两个输入数据,在编码结果后加1个“=”;
e.如果最后剩下一个输入数据,编码结果后加2个“=”;
f.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
二、HASH加密/单向散列函数
简述:Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度(32个字符)的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。对用相同数据,加密之后的密文相同。 常见的Hash算法有MD5和SHA。由于加密结果固定,所以基本上原始的哈希加密已经不再安全,于是衍生出了加盐的方式。加盐:先对原始数据拼接固定的字符串再进行MD5加密。
特点:
1) 加密 后密文的长度是定长(32个字符的密文)的
2)如果明文不一样,那么散列后的结果一定不一样
3)如果明文一样,那么加密后的密文一定一样(对相同数据加密,加密后的密文一样)
4)所有的加密算法是公开的
5)不可以逆推反算(不能根据密文推算出明文),但是可以暴力 破解 ,碰撞监测
原理:MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要。
1)数据填充
对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。
填充方法:在消息后面进行填充,填充第一位为1,其余为0。
2)添加信息长度
在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对264取模)。
在此步骤进行完毕后,最终消息长度就是512的整数倍。
3)数据处理
准备需要用到的数据:
4个常数:A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;
4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z);G(X,Y,Z)=(X & Z) | (Y & (~Z));H(X,Y,Z)=X ^ Y ^ Z;I(X,Y,Z)=Y ^ (X | (~Z));
把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。
三、对称加密
经典算法:
1)DES数据加密标准
DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法是这样工作的:如Mode为加密,则用Key去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。
2)3DES使用3个密钥,对消息进行(密钥1·加密)+(密钥2·解密)+(密钥3·加密)
3)AES高级加密标准
如图,加密/解密使用相同的密码,并且是可逆的
四、非对称加密
特点:
1)使用公钥加密,使用私钥解密
2)公钥是公开的,私钥保密
3)加密处理安全,但是性能极差
经典算法RSA:
1)RSA原理
(1)求N,准备两个质数p和q,N = p x q
(2)求L,L是p-1和q-1的最小公倍数。L = lcm(p-1,q-1)
(3)求E,E和L的最大公约数为1(E和L互质)
(4)求D,E x D mode L = 1
五、数字签名
原理以及应用场景:
1)数字签名的应用场景
需要严格验证发送方身份信息情况
2)数字签名原理
(1)客户端处理
对"消息"进行HASH得到"消息摘要"
发送方使用自己的私钥对"消息摘要"加密(数字签名)
把数字签名附着在"报文"的末尾一起发送给接收方
(2)服务端处理
对"消息" HASH得到"报文摘要"
使用公钥对"数字签名"解密
对结果进行匹配
六、数字证书
简单说明:
证书和驾照很相似,里面记有姓名、组织、地址等个人信息,以及属于此人的公钥,并有认证机构施加数字签名,只要看到公钥证书,我们就可以知道认证机构认证该公钥的确属于此人。
数字证书的内容:
1)公钥
2)认证机构的数字签名
证书的生成步骤:
1)生成私钥openssl genrsa -out private.pem 1024
2)创建证书请求openssl req -new -key private.pem -out rsacert.csr
3)生成证书并签名,有效期10年openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
4)将PEM格式文件转换成DER格式openssl x509 -outform der -in rsacert.crt -out rsacert.der
5)导出P12文件openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
iOS开发中的注意点:
1)在iOS开发中,不能直接使用PEM格式的证书,因为其内部进行了Base64编码,应该使用的是DER的证书,是二进制格式的;
2)OpenSSL默认生成的都是PEM格式的证书。
七、https
HTTPS和HTTP的区别:
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
1)https协议需要到ca申请证书,一般免费证书很少,需要交费。
2)http是 超文本传输协议 ,信息是明文传输,https则是具有 安全性 的 ssl 加密传输协议。
3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的 网络协议 ,比http协议安全。
5)SSL:Secure Sockets Layer安全套接字层;用数据加密(Encryption)技术,可确保数据在网络上传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape 浏览器 即可支持SSL。目前版本为3.0。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。