① 常见密码算法原理
PBKDF2(Password-Based Key Derivation Function)是一个用来导出密钥的函数,用来生成加密的密码,增加破解的难度,类似bcrypt/scrypt等,可以用来进行密码或者口令的加密存储。主要是盐值+pwd,经过多轮HMAC算法的计算,产生的密文。
PBKDF2函数的定义
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
• PRF是一个伪随机函数,例如HASH_HMAC函数,它会输出长度为hLen的结果。
• Password是用来生成密钥的原文密码。
• Salt是一个加密用的盐值。
• c是进行重复计算的次数。
• dkLen是期望得到的密钥的长度。
• DK是最后产生的密钥。
https://segmentfault.com/a/1190000004261009
下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理。
1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g。
2,Diffie-Hellman密钥交换是一个两部分的过程,Alice和Bob都需要一个私有的数字a,b。
下面是DH交换的过程图:
本图片来自wiki
下面我们进行一个实例
1.爱丽丝与鲍伯协定使用p=23以及g=5.
2.爱丽丝选择一个秘密整数a=6, 计算A = g^a mod p并发送给鲍伯。
A = 5^6 mod 23 = 8.
3.鲍伯选择一个秘密整数b=15, 计算B = g^b mod p并发送给爱丽丝。
B = 5^15 mod 23 = 19.
4.爱丽丝计算s = B a mod p
19^6 mod 23 = 2.
5.鲍伯计算s = A b mod p
8^15 mod 23 = 2.
ECDH:
ECC算法和DH结合使用,用于密钥磋商,这个密钥交换算法称为ECDH。交换双方可以在不共享任何秘密的情况下协商出一个密钥。ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点P,一个整数k,求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。ECDH即建立在此数学难题之上。密钥磋商过程:
假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。
来自 http://www.cnblogs.com/fishou/p/4206451.html
https://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----
while a RSA public key contains only the following data:
-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
molus INTEGER, -- n
publicExponent INTEGER -- e
}
-----END RSA PUBLIC KEY-----
and this explains why the private key block is larger.
Note that a more standard format for non-RSA public keys is
-----BEGIN PUBLIC KEY-----
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
-----END PUBLIC KEY-----
More info here.
BTW, since you just posted a screenshot of the private key I strongly hope it was just for tests :)
密钥的长度
C:\herong>java RsaKeyGenerator 128
p: 17902136406704537069
q: 17902136406704537077
m:
Molus:
Key size: 128
Public key:
Private key:
C:\herong>java RsaKeyGenerator 256
p:
q:
m: ...
Molus: ...
Key size: 256
Public key: ...
Private key: ...
https://security.stackexchange.com/questions/90169/rsa-public-key-and-private-key-lengths
https://stackoverflow.com/questions/2921508/trying-to-understand-java-rsa-key-size >
http://www.herongyang.com/Cryptography/RSA-BigInteger-Keys-Generated-by-RsaKeyGenerator-java.html
update() adds data to the Cipher’s internal buffer, then returns all currently completely encoded blocks. If there are any encoded blocks left over, they remain in the Cipher’s buffer until the next call, or a call to doFinal(). This means that if you call update() with a four byte array to encrypt, and the buffer size is eight bytes, you will not receive encoded data on the return (you’ll get a null instead). If your next call to update() passes five bytes of data in, you will get an 8 byte (the block size) array back, containing the four bytes passed in on the previous call, the first four bytes from the current call – the remaining byte from the current call is left in the Cipher’s buffer.
doFinal() on the other hand is much simpler: it encrypts the passed data, pads it out to the necessary length, and then returns it. The Cipher is essentially stateless.
来自 https://segmentfault.com/a/1190000006931511
DH算法的中间人攻击
在最初的描述中,迪菲-赫尔曼密钥交换本身并没有提供通讯双方的身份验证服务,因此它很容易受到中间人攻击。 一个中间人在信道的中央进行两次迪菲-赫尔曼密钥交换,一次和Alice另一次和Bob,就能够成功的向Alice假装自己是Bob,反之亦然。而攻击者可以解密(读取和存储)任何一个人的信息并重新加密信息,然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。
优缺点:
1、 仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会。
2、 除对全局参数的约定外,密钥交换不需要事先存在的基础结构。
然而,该技术也存在许多不足:
1、 没有提供双方身份的任何信息。
2、 它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作。
3、 没办法防止重演攻击。
4、 容易遭受中间人的攻击。第三方C在和A通信时扮演B;和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。中间人的攻击按如下进行:
(1) B在给A的报文中发送他的公开密钥。
(2) C截获并解析该报文。C将B的公开密钥保存下来并给A发送报文,该报文具有B的用户ID但使用C的公开密钥YC,仍按照好像是来自B的样子被发送出去。A收到C的报文后,将YC和B的用户ID存储在一块。类似地,C使用YC向B发送好像来自A的报文。
(3) B基于私有密钥XB和YC计算秘密密钥K1。A基于私有密钥XA和YC计算秘密密钥K2。C使用私有密钥XC和YB计算K1,并使用XC和YA计算K2。
(4) 从现在开始,C就可以转发A发给B的报文或转发B发给A的报文,在途中根据需要修改它们的密文。使得A和B都不知道他们在和C共享通信。
② 浠涔堟槸md5锷犲瘑
浠庝簨缃戠粶瀹夊叏杩欎竴琛屼笟镄勪汉閮界煡阆掳纴鎴戜滑锅氭笚阃忔祴璇曟椂缁忓父浼氶亣鍒伴渶瑕佽В瀵嗙殑Md5瀵嗘枃銆备负浜呜兘澶熸彁鍗囨晥鐜囷纴鎴戜滑鍙浠ュ湪缃戜笂镓句竴浜涜兘澶熷湪绾縨d5瑙e瘑镄勭绣绔欍备笅闱㈢粰澶у跺垎浜锲藉唴甯哥敤镄勫嚑涓鍏嶈垂MD5鍦ㄧ嚎瑙e瘑缃戠珯銆
涓銆丮D5鍦ㄧ嚎锷犲瘑瑙e瘑
阍埚筸d5绛夊叏鐞冮氱敤鍏寮镄勫姞瀵嗙畻娉曡繘琛屽弽钖戞煡璇锛屽缓绔嬩简瀵嗘枃瀵瑰簲镆ヨ㈡暟鎹搴掳纴MD5锷犲瘑瑙e瘑骞冲彴鍙镆ヨ㈠緢澶氩嶆潅瀵嗘枃锛屾敮鎸佸氱岖畻娉曪纴瀹炴椂镆ヨ㈣板綍瓒呰繃24涓囦嚎𨱒★纴鍏卞崰鐢160T纭鐩桡纴鎴愬姛鐜95%浠ヤ笂銆傝繖涓缃戠珯锲藉唴寰埚氢汉鍦ㄤ娇鐢锛屽洜涓哄畠鏄鍏嶈垂镄勚傚傛灉鍦╩d5涓婅В瀵嗕笉浜嗙殑瀵嗘枃鍦ㄥ叾浠栬В瀹㈢绣绔欎篃锘烘湰娌℃垙浜嗐
③ MD5鏄浠涔埚姞瀵嗙畻娉曪纻
MD5锷犲瘑鏄涓绉嶅父鐢ㄧ殑锷犲瘑鏂瑰纺锛屽畠鍙浠ュ皢浠绘剰闀垮害镄勬暟鎹杞鎹涓哄浐瀹氶暱搴︾殑128浣嶅搱甯屽硷纸鍗32浣峂D5鍊硷级锛屽苟涓斿叿链変笉鍙阃嗘с佸敮涓镐с佷笉鍙绡℃敼镐х瓑鐗圭偣銆傚湪缃戠粶浼犺緭涓锛屽父鐢∕D5锷犲瘑𨱒ヤ缭璇佹暟鎹镄勫畨鍏ㄦс
MD5鍦ㄧ嚎瑙e瘑铡熺悊
MD5鍦ㄧ嚎瑙e瘑鏄鎸囬氲繃鐗瑰畾镄勭畻娉曟潵镰磋ВMD5锷犲瘑镄勫瘑镰併傜敱浜崄D5锷犲瘑镄勪笉鍙阃嗘э纴锲犳MD5鍦ㄧ嚎瑙e瘑骞朵笉鏄阃氲繃鐩存帴瑙e瘑𨱒ュ疄鐜扮殑锛岃屾槸阃氲繃绌蜂妇娉曘佸瓧鍏告敾鍑荤瓑鏂瑰纺𨱒ョ牬瑙e瘑镰併
MD5鍦ㄧ嚎瑙e瘑姝ラ
涓嬮溃浠嬬粛涓涓婱D5鍦ㄧ嚎瑙e瘑镄勫叿浣撴ラわ细
1.镓揿紑MD5鍦ㄧ嚎瑙e瘑缃戠珯锛屼緥濡俶d5decrypt.net銆
2.灏嗛渶瑕佽В瀵嗙殑32浣峂D5鍊煎嶅埗鍒扮绣绔欑殑杈揿叆妗嗕腑銆
3.阃夋嫨瑙e瘑鏂瑰纺锛屼緥濡傚瓧鍏告敾鍑汇佹毚锷涚牬瑙g瓑銆
4.镣瑰嚮钬滆В瀵嗏濇寜阍锛岀瓑寰呰В瀵嗙粨鏋溿
5.濡傛灉瑙e瘑鎴愬姛锛岀绣绔欎细杩斿洖瑙e瘑钖庣殑鏄庢枃瀵嗙爜銆
MD5鍦ㄧ嚎瑙e瘑宸ュ叿鎺ㄨ崘
涓嬮溃鎺ㄨ崘鍑犳惧父鐢ㄧ殑MD5鍦ㄧ嚎瑙e瘑宸ュ叿锛
1.md5decrypt.net锛氲繖鏄涓娆惧厤璐圭殑鍦ㄧ嚎MD5瑙e瘑宸ュ叿锛屾敮鎸佸氱嶈В瀵嗘柟寮忋
2.md5online.org锛氲繖鏄涓娆剧亩鍗曟槗鐢ㄧ殑MD5鍦ㄧ嚎瑙e瘑宸ュ叿锛屾敮鎸佸氱嶈В瀵嗘柟寮忋
3.cmd5.org锛氲繖鏄涓娆句笓涓氱殑MD5鍦ㄧ嚎瑙e瘑宸ュ叿锛屾敮鎸佸氱嶈В瀵嗘柟寮忓拰澶氱嶈瑷銆
MD5鍦ㄧ嚎瑙e瘑镄勬敞镒忎簨椤
鍦ㄨ繘琛孧D5鍦ㄧ嚎瑙e瘑镞讹纴闇瑕佹敞镒忎互涓嫔嚑镣癸细
1.瑙e瘑杩囩▼闇瑕佷竴瀹氱殑镞堕棿锛岄渶瑕佽愬绩绛夊緟瑙e瘑缁撴灉銆
2.瑙e瘑鎴愬姛骞朵笉镒忓懗镌瀵嗙爜涓瀹氭g‘锛岄渶瑕佹牴鎹瀹为檯𨱍呭喌杩涜岄獙璇併
3.鍦ㄤ娇鐢∕D5鍦ㄧ嚎瑙e瘑宸ュ叿镞讹纴闇瑕佹敞镒忎缭鎶や釜浜轰俊鎭鍜屾暟鎹瀹夊叏锛岄夋嫨鍙淇$殑缃戠珯杩涜屾搷浣溿
④ 锷犲瘑鎶链04-鍝埚笇绠楁硶-MD5铡熺悊
MD5娑堟伅鎽樿佺畻娉曪纸鑻辫锛歁D5 Message-Digest Algorithm锛夛纴涓绉嶈骞挎硾浣跨敤镄勫瘑镰佹暎鍒楀嚱鏁帮纴鍙浠ヤ骇鐢熷嚭涓涓 128 浣嶏纸 16 瀛楄妭锛岃琛ㄧず涓 32 浣嶅崄鍏杩涘埗鏁板瓧锛夌殑鏁e垪鍊硷纸hash value锛夛纴鐢ㄤ簬纭淇濅俊鎭浼犺緭瀹屾暣涓镊淬侻D5 鐢辩编锲藉瘑镰佸﹀剁绥绾冲痉路𨱒庣淮鏂鐗癸纸Ronald Linn Rivest锛夎捐★纴浜 1992 骞村叕寮锛岀敤浠ュ彇浠 MD4 绠楁硶銆傝繖濂楃畻娉旷殑绋嫔簭鍦 RFC 1321 涓琚锷犱互瑙勮寖銆
灏嗘暟鎹锛埚备竴娈垫枃瀛楋级杩愮畻鍙树负鍙︿竴锲哄畾闀垮害鍊硷纴鏄鏁e垪绠楁硶镄勫熀纭铡熺悊銆
娉ㄦ剰锛歁D5 瀵规秷鎭镄勯暱搴︽病链夎佹眰銆
瀛楄妭镄勬帓鍒楁柟寮忔湁涓や釜阃氱敤瑙勫垯
姣斿傦细瀛桦偍 16 杩涘埗鍊 0x12345678锛岄渶瑕佷娇鐢 4 涓瀛楄妭锛屽瓨鍌ㄥ瓧鑺傚湪鍐呭瓨鍦板潃澧为暱鏂瑰悜鍒嗗埆鏄
澶х搴忔柟寮忓瓨鍌锛0x12 0x34 0x56 0x78
灏忕搴忔柟寮忓瓨鍌锛0x78 0x56 0x34 0x12
1996 骞村悗琚璇佸疄瀛桦湪寮辩偣锛屽彲浠ヨ锷犱互镰磋В锛屽逛簬闇瑕侀珮搴﹀畨鍏ㄦх殑璧勬枡锛屼笓瀹朵竴鑸寤鸿鏀圭敤鍏朵粬绠楁硶锛屽 SHA-2銆2004 骞达纴璇佸疄 MD5 绠楁硶镞犳硶阒叉㈢版挒鏀诲嚮锛屽洜姝や笉阃傜敤浜庡畨鍏ㄦцよ瘉锛屽 SSL 鍏寮瀵嗛挜璁よ瘉鎴栨槸鏁板瓧绛惧悕绛夌敤阃斻
2009 骞达纴涓锲界戝﹂櫌镄勮阿娑涘拰鍐锏诲浗浠呯敤浜 2 20.96 镄勭版挒绠楁硶澶嶆潅搴︼纴镰磋В浜 MD5 镄勭版挒鎶垫姉锛岃ユ敾鍑诲湪鏅阃氲$畻链轰笂杩愯屽彧闇瑕佹暟绉挜挓銆2011 骞达纴RFC 6151 绂佹 MD5 鐢ㄤ綔瀵嗛挜鏁e垪娑堟伅璁よ瘉镰併
MD5 鍝埚笇钖庣殑浣嶆暟涓鑸涓轰袱绉嶏纴16 浣崭笌 32 浣嶃16 浣嶅疄闄呬笂鏄浠 32 浣嶅瓧绗︿覆涓锛屽彇涓闂寸殑绗 9 浣嶅埌绗 24 浣岖殑閮ㄥ垎銆
MD5 32 ("123123") = ""
MD5 16 ("123123") = "13955235245B2497"
⑤ md5鏄浠涔
MD5鏄淇℃伅鎽樿佺畻娉曪纸鑻辫锛歁D5Message-DigestAlgorithm锛夈
MD5鐢辩编锲藉瘑镰佸﹀剁绥绾冲痉路𨱒庣淮鏂鐗癸纸RonaldLinnRivest锛夎捐★纴浜1992骞村叕寮锛岀敤浠ュ彇浠MD4绠楁硶銆傝繖濂楃畻娉旷殑绋嫔簭鍦≧FC1321镙囧嗳涓琚锷犱互瑙勮寖銆备竴绉嶈骞挎硾浣跨敤镄勫瘑镰佹暎鍒楀嚱鏁帮纴鍙浠ヤ骇鐢熷嚭涓涓128浣嶏纸16瀛楄妭锛夌殑鏁e垪锛坔ashvalue锛夛纴鐢ㄤ簬纭淇濅俊鎭浼犺緭瀹屾暣涓镊淬
1996骞村悗璇ョ畻娉曡璇佸疄瀛桦湪寮辩偣锛屽彲浠ヨ锷犱互镰磋В锛屽逛簬闇瑕侀珮搴﹀畨鍏ㄦх殑鏁版嵁锛屼笓瀹朵竴鑸寤鸿鏀圭敤鍏朵粬绠楁硶锛屽係HA-2銆2004骞达纴璇佸疄MD5绠楁硶镞犳硶阒叉㈢版挒锛坈ollision锛夛纴锲犳や笉阃傜敤浜庡畨鍏ㄦцよ瘉锛屽係SL鍏寮瀵嗛挜璁よ瘉鎴栨槸鏁板瓧绛惧悕绛夌敤阃斻
鐩稿叧淇℃伅锛
1991骞达纴Rivest寮鍙戝嚭鎶链涓婃洿涓鸿秼杩戞垚镡熺殑 md5绠楁硶銆傚畠鍦∕D4镄勫熀纭涓婂炲姞浜"瀹夊叏-甯﹀瓙"锛坰afety-belts锛夌殑姒傚康銆傝槠铹祃D5姣拟D4澶嶆潅搴﹀ぇ涓浜涳纴浣嗗嵈镟翠负瀹夊叏銆傝繖涓绠楁硶寰堟槑鏄剧殑鐢卞洓涓鍜孧D4璁捐℃湁灏戣镐笉钖岀殑姝ラょ粍鎴愩
鍦 MD5绠楁硶涓锛屼俊鎭鎽樿佺殑澶у皬鍜屽~鍏呯殑蹇呰佹浔浠朵笌MD4瀹屽叏鐩稿悓銆侱en boer鍜孊osselaers镟惧彂鐜癕D5绠楁硶涓镄勫亣鍐茬獊锛坧seudo-collisions锛夛纴浣嗛櫎姝や箣澶栧氨娌℃湁鍏朵粬琚鍙戠幇镄勫姞瀵嗗悗缁撴灉浜嗐
⑥ md5指的是什么
MD5即Message-Digest Algorithm5信息摘要算法5,是计算机广泛使用的散列算法之一又译摘要算法,哈希算法。经MD2,MD3和MD4发展而来,诞生于20世纪90年代初。用于确保信息传输完整一致。虽然已被破解,但仍然具有较好的安全性,加之可以免费使用,所以仍广泛运用于数字签名,文件完整性验证以及口令加密等领域。
md5的研究
2004年8月17日的美国加州圣巴巴拉的国际密码学会议上,来自中国山东大学的王小云教授做了破译MD5。HAVAL-128,MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了世界通行密码标准MD5不再安全。2008年,荷兰埃因霍芬技术大学科学家成功把2个可执行文件进行了MD5碰撞,使得这两个运行结果不同的程序被计算出同一个MD。