密碼學(xué)

對(duì)稱加密算法

非對(duì)稱加密算法

非對(duì)稱加密:加密密鑰與解密密鑰成對(duì)出現(xiàn)间学,一般為私鑰和公鑰囱皿。私鑰用于簽名或加密荆姆;公鑰用于驗(yàn)簽或解密蔼囊。

RSA

密鑰生成

  • OpenSSL明文生成命令如下:
## generate private key without password
openssl genrsa -out rsa.key 2048

## export public key
openssl rsa -in rsa.key -pubout -out rsa.pub
  • 明文私鑰內(nèi)容如下:BEGIN RSA PRIVATE KEY為PKCS#1格式
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArzMYu9B07EwgLma0c+BK+vGAGrVqvRnhxPr4o7NVAfCqKe6V
7evym0ClkCK4NJ7s8bHJjmTxBXIpZuPOJBJhG2H0EALFap7sfzSxbbHIUkoJDO/c
kuo7enZ/R5UIs/esuua5/oiPlx3XY/9+OHviuyCtCPy0dFi7j9TNxstsUj7eXs+Y
r1TC+bA7CointNqi9TDwU3cM74jdgUrIU/uLtqL2mB22RCa80FfcURp7tQYVDyPO
nHex4ijjjyl1zi26YI1kxZf8dRlRoFfGTayrS/8Txp0KqGKEsLJyYQ8DeuEhW9gW
/Ka340ZC7ObVMqTzMJ7pzxyWmbRqHOIlO54jxQIDAQABAoIBAB2gHEyWAU97x+1Q
vK7jfIpWj/z0NGppl/3BGo5D4toDIiMZDw0+WrXaBqUK2e87+IEeOSD0/LSZC1s0
pkT/PqBsveJ/NXbEDOWtuVr9NwyDLGidnsTRCuG4a+lk0CXueazZGxZpbS52g1eL
eoJ+oGZYLipY4QLThlPZ/jnhaB238CfAQ+KfkkxdJcPEJWzONalWsTrb0RK+0WHZ
sgwJwCn9zBECZYNkHKKV0G1/TOyslZTZwo8aXCsEtwQmtwqtuYEaPCTrJ8YPpjoD
HjEdt6sUcCJd98aHxJ9zuABgDlq7NZAsAhgmdPPcnXu5xSFgFw7yPj/6UDgZxtcb
5VkSMsECgYEA2a9nKL241eMnqJ9/dBE84fNFEg0C9hNEljGr8sxilg0cs3nk4v6P
GRVcl6fjmRm6bIUzHPmFFFBOzr9JIlKv71II1S1Dn4l0gIuT5epPB1OlinBCU+Ur
jjhuZ3UOeZQ3LF9nKeDqn6jDjY6jXCQRK9xqKmzZ2yCUGrwYKpa0JskCgYEAzgla
B+y5bWPLYC0sv76yz5I+yTfIl7PAO6clgzSgBhHNFkjPA0eWcA/AA9tZS5Nz5MB5
ACiKN82dmnOedkkpJg29CTc7KttNTie5A7n+reKKV8qMMSM7I/MbQn/j7GIrW/uG
6WiZveXtK7o4jLZOGPE2nTx0iFGrrUjLK3TURx0CgYAdD3J5GOLNAvcvZqOQLiDv
lRdacow7p5TXbCglUK20lGmJeDNbLlqSIazrvgj/TlT52cpaCuF+Nb5fkV/FCj7c
dxogw1ssuB/qbTfAUMheFQebdKMWKhjncpcijpjxGB1Jei7+gz0vNUtt4WXjjhkQ
vusZYNCwlSfQbd3YCahhKQKBgC/xeSOy8AsGV8LPgEQ2CcHHVBjahDDYwPigklgP
nNUMu15eHt2ygM0evR2oowS1ERi/uOhShqcpj2zrTopTx+F0/PHyCjCUy05Oa/z0
ANFRj8OR/EFK424gGc3FmLHevhwvUVtq3auUnzW3pYUIvu+K4ZyA/tThvEMcVzqL
ewH5AoGBAKx3QRwdnCYFZTV26DO1LqjT3b2AbGBtM18u2mPwf593qJt3oJdJMGii
LGkGNZgCm88gMN/sY+chSJumlCHToFHLiovVIManpkv0Y7sXHw6TUeSjg5hB84b6
If/YzYcoFIpi1uKGVMSTnEdzLx1sjqM00qsVZz9cz8f71TMOOsQx
-----END RSA PRIVATE KEY-----
  • 公鑰內(nèi)容如下:BEGIN PUBLIC KEY為PKCS#8格式
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArzMYu9B07EwgLma0c+BK
+vGAGrVqvRnhxPr4o7NVAfCqKe6V7evym0ClkCK4NJ7s8bHJjmTxBXIpZuPOJBJh
G2H0EALFap7sfzSxbbHIUkoJDO/ckuo7enZ/R5UIs/esuua5/oiPlx3XY/9+OHvi
uyCtCPy0dFi7j9TNxstsUj7eXs+Yr1TC+bA7CointNqi9TDwU3cM74jdgUrIU/uL
tqL2mB22RCa80FfcURp7tQYVDyPOnHex4ijjjyl1zi26YI1kxZf8dRlRoFfGTayr
S/8Txp0KqGKEsLJyYQ8DeuEhW9gW/Ka340ZC7ObVMqTzMJ7pzxyWmbRqHOIlO54j
xQIDAQAB
-----END PUBLIC KEY-----
  • OpenSSL密文生成命令如下:
## generate rsa private key with password
openssl genrsa -aes256 -out name_private.key 2048
  • 密文如下:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,6BD39B13ECA6BE46F418ECC341EEC626

p4TtCgJUP7Ik/f2xqJrJ3zfbGiA49T3Vrf9naKSYrZawGVhqYxRu+fiXePxKc25L
8rdnwCiF7x2xtR9uNWcWlFIe76KlPqrFMqBzVrEloOb0bM9TvZ06ZsYE6DrlH2xj
1NLzKz9I3CQ9M/VZIHInzvm7J1vFPFwSH5NSjq3oIVnMgfPMzaq5DCBYIxJ4nOEm
fGRx9bXnTzpIPCR6MrgmZiWzEt3akgkKSzQlfEEOLWfjEDBvJmuLO20CIfj+Q8Y6
rTMroud7sZb+FFDHAB3BolEp2Bqfi0YQJ8rMKTl+On3QFdBQD+v9jcTurqhD1C47
3KHieg18ZN2OxNTHHJMo0A1VEent6lvBSHIPKtgyUBP87+nUPsWoBDQV+zoL3pCP
O4zlY35WEt6BU+ImupkNNjZ70Sgfr3hUdXN3ZZi2rWUqGABzUpBREF9UuQVuqOeO
lpswWKMKQIXuvbZ70OdZ6JsUBMdeEIZSvEDeez85ef2GwuB6IvJtxmWNf4POiJxJ
oNponrYCh6RatQLDKgg0iqE2fkyq6QoKN8mFIHNwG7LS5CsSCiNzsj1lhl4pm2eB
5NQrInKa/sDFN1uFmtrWGw1bhyJdUPGPhaw5Xb1DRh1dbxooieEaCysuu+RpZpqc
AVwhrKf2IB2N82mEiQfD0FwJ4FGtBhlAmtMHHjtlDmbh1qzOYs1wUKpPY8C72fza
XwfS8kMdac3HWJc4osJ+/YoQv9cQtQX/DwiA/86nxRiogjbtDYERneu2ucxnzFrV
i0l9frX2qvkuXWArlT9+0zFZA3fTF0fP5j2mrf8tdTE+OdAVqRW50l2JiVId8qUv
2D5ygiHn1h+zPreeckA1386HMYwPirHcr/JpzrI5R+hCgXGEVi2GQISRjsVa2sqS
hNEirQFe7M6HPgtPaXcjKm/R8MY2aVHI3irTccXvIjDo2GCb85ZQFLqdQOE3N+h7
xrdcDaNZV6K6ZcudUsLiiH6gjXeiTL9VeSJQdyJ5mDJpEl9297JU7CbrRwndUgTV
qJ6Q5s9r158Bb0aLQwYFx0FEwqIiQB+tZoJ1e9+H8jNuRvDn35thMrOw+QcsMsT8
7QHL741jjcB51610afi5Zb2xhUKiWwrJLLKfp+e+4B3aFnhBm8anRcwBaYaF4OWK
4O8vialNxUelI6qJqyjb9sS/9G+YCmWjkvO/Wc7CcZ2dag0cxvyV+XZllUfFaZpN
5KbIH+zv+6pa2GyeePWekvsYQstXB43lKDYYjcO89SVGwEXGw1W7TlJI9SPZl3eR
FcN/O7CEcZfA17XDsS7u6FZgLfRlLeqSpRhRxgAuB7XpdwKVazPc6fVr48h6rH/M
Po9+wDUId7wrdAnxZgETpcIVgISpszfCYGKuYc1tZXaBDZxivHCV4oTdDp9uFwF1
QB6kZIcQ2evqDLtQt5jRNHl7792RNiwWIZd66WTV2fie2YHoF42lhj7/AdbI+nDx
Wzt0bvV5/lwsrnSZbLLTGwdxs/eoDrhhuCBeChoeXsxwm0yCu7cy8Ogqv/LXu5m8
Nm7HkkZ0eldHiFhOiRSDRCfzJwCBmZt6wPnvgsslBwYA8MCN5qI2a3nxMz5rxip/
-----END RSA PRIVATE KEY-----
  • 其他命令
## view the public key
openssl rsa -pubin -in name.pub -noout -text

## remove the password of the private key
openssl rsa -in name.key -out name_plain.key

## view private key with interactive mode
openssl rsa -in name.key -noout -text

## view private key with a password file
openssl rsa -in name.key -noout -text -passin file:path/to/password

密鑰分析

OpenSSL命令生成的私鑰格式默認(rèn)為PEM焚志,所以在進(jìn)一步分析私鑰之前,先大致了解一些術(shù)語(yǔ)畏鼓。

  • PEM
  • DER
  • PKCS#1
  • PKCS#8

PKCS#1

RSA的PKCS#1格式的私鑰結(jié)構(gòu)如下:其中比較重要的都是與RSA算法相關(guān)的整數(shù)酱酬,RSA算法細(xì)節(jié)不在此文討論。

RSAPrivateKey ::= SEQUENCE { 
  version Version, //版本 
  modulus INTEGER, // RSA合數(shù)模 n 
  publicExponent INTEGER, //RSA公開(kāi)冪 e 
  privateExponent INTEGER, //RSA私有冪 d 
  prime1 INTEGER, //n的素?cái)?shù)因子p 
  prime2 INTEGER, //n的素?cái)?shù)因子q 
  exponent1 INTEGER, //值 d mod (p-1) 
  exponent2 INTEGER, //值 d mod (q-1) 
  coefficient INTEGER, //CRT系數(shù) (inverse of q) mod p 
  otherPrimeInfos OtherPrimeInfos OPTIONAL 
}

首先云矫,我們可以通過(guò)以下Go代碼將PEM格式的私鑰轉(zhuǎn)換為DER格式的字節(jié)串膳沽,并解析為可用于分析的私鑰結(jié)構(gòu)體:

func getPrivKey(keyFile string) (*rsa.PrivateKey, error) {
  key, err := ioutil.ReadFile(keyFile)
  if err != nil {
      return nil, err
  }

  block, _ := pem.Decode([]byte(key))
  if block == nil {
    return nil, fmt.Errorf("failed to decode pem data")
  }

  priKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
  if err != nil {
    return nil, err
  }

  fmt.Println(priKey.N.Bytes()) // 模數(shù)N
  eBytes := make([]byte, 8)
  binary.BigEndian.PutUint64(eBytes, uint64(priKey.E)) // 公有冪,一般為65537
  fmt.Println(eBytes)
  fmt.Println(priKey.D.Bytes()) // 私有冪
  fmt.Println(priKey.Primes[0].Bytes()) // n的素?cái)?shù)因子p 
  fmt.Println(priKey.Primes[0].Bytes()) // n的素?cái)?shù)因子q
  fmt.Println(priKey.Precomputed.Dp.Bytes()) //值 d mod (p-1) 
  fmt.Println(priKey.Precomputed.Dq.Bytes()) //值 d mod (q-1) 
  fmt.Println(priKey.Precomputed.Qinv.Bytes()) // CRT系數(shù) (inverse of q) mod p 

  return priKey, nil
}

或者也可以通過(guò)ASN.1 JS Decoder對(duì)DER進(jìn)行分析让禀,為了方便挑社,我們直接采用第二種方式分析,如下:

image.png

其中巡揍,模數(shù)N部分如下痛阻,其他類似:
a. 02: tag
b. 82 – 81: 代表長(zhǎng)度用1byte表示,82代表長(zhǎng)度用2byte表示(此字節(jié)部分tag后不存在)
c. 0101: length 2bytes表示
d. 00: 在modulus數(shù)據(jù)前添加00腮敌,原因未知阱当,請(qǐng)知情道友告知俏扩。
e. 模數(shù)N

散列算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弊添,隨后出現(xiàn)的幾起案子录淡,更是在濱河造成了極大的恐慌,老刑警劉巖油坝,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫉戚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡免钻,警方通過(guò)查閱死者的電腦和手機(jī)彼水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)极舔,“玉大人凤覆,你說(shuō)我怎么就攤上這事〔鹞海” “怎么了盯桦?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渤刃。 經(jīng)常有香客問(wèn)我拥峦,道長(zhǎng),這世上最難降的妖魔是什么卖子? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任略号,我火速辦了婚禮,結(jié)果婚禮上洋闽,老公的妹妹穿的比我還像新娘玄柠。我一直安慰自己,他們只是感情好诫舅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布羽利。 她就那樣靜靜地躺著,像睡著了一般刊懈。 火紅的嫁衣襯著肌膚如雪这弧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天虚汛,我揣著相機(jī)與錄音匾浪,去河邊找鬼。 笑死卷哩,一個(gè)胖子當(dāng)著我的面吹牛蛋辈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殉疼,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梯浪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瓢娜?” 一聲冷哼從身側(cè)響起挂洛,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眠砾,沒(méi)想到半個(gè)月后虏劲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褒颈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柒巫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷丸。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堡掏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刨疼,到底是詐尸還是另有隱情泉唁,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布揩慕,位于F島的核電站亭畜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏迎卤。R本人自食惡果不足惜拴鸵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜗搔。 院中可真熱鬧劲藐,春花似錦、人聲如沸碍扔。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)不同。三九已至厉膀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間二拐,已是汗流浹背服鹅。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留百新,地道東北人企软。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饭望,于是被迫代替她去往敵國(guó)和親仗哨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子形庭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這是密碼學(xué)筆記第三篇。之前兩篇分析了 RSA 算法和橢圓曲線密碼學(xué)的基本原理厌漂,從中可以知道 RSA 算法的本質(zhì)是大...
    __七把刀__閱讀 19,524評(píng)論 4 20
  • 密碼學(xué)思維導(dǎo)圖 密碼學(xué)基本認(rèn)知 密碼學(xué)是科學(xué)萨醒; 密碼學(xué)理論是公開(kāi)的,因此苇倡,不要使用保密的密碼算法富纸; 密碼學(xué)算法是相...
    獨(dú)木舟的木閱讀 4,790評(píng)論 0 2
  • openssl介紹 密碼學(xué)標(biāo)準(zhǔn)和我們平常所見(jiàn)的互聯(lián)網(wǎng)協(xié)議一樣,是一種大家都遵守的約定和標(biāo)準(zhǔn)旨椒,比如PKCS#1中規(guī)定...
    康小曹閱讀 2,154評(píng)論 0 2
  • IOS 逆向開(kāi)發(fā)(一)密碼學(xué) RSA 1. 密碼學(xué)發(fā)展簡(jiǎn)介 密碼學(xué)是指研究信息加密晓褪,破解密碼的技術(shù)科學(xué)。密碼學(xué)的起...
    孔雨露閱讀 822評(píng)論 0 3
  • 何為密碼學(xué)综慎? 這里的密碼涣仿,不是我們的登錄密碼。密碼學(xué)是指研究信息加密示惊,破解密碼的技術(shù)科學(xué)变过。密碼學(xué)的起源可追溯到20...
    HLjane_閱讀 529評(píng)論 0 0