跟第三方聯調的時候會碰到各種加密算法,所以總結壹下。
AES不是將拿到的明文壹次性加密,而是分組加密,就是先將明文切分成長度相等的塊,每塊大小128bit,再對每壹小塊進行加密。那麽問題就來了,並不是所有的原始明文串能被等分成128bit,例如原串大小200bit,那麽第二個塊只有72bit,所以就需要對第二個塊進行填充處理,讓第二個塊的大小達到128bit。常見的填充模式有
不進行填充,要求原始加密串大小必須是128bit的整數倍;
假設塊大小8字節,如果這個塊跟8字節還差n個字節,那麽就在原始塊填充n,直到滿8字節。例:塊{1,2,3},跟8字節差了5個字節,那麽補全後的結果{1,2,3,5,5,5,5,5}後面是五個5,塊{1,2,3,..7}跟8字節差了1個字節,那麽補全後就是{1,2,3,...,7,1},就是補了壹個1。
如果恰好8字節又選擇了PKCS5Padding填充方式呢?塊{1,2,3...8}填充後變成{1,2,3...8,8...8},原串後面被補了8個8,這樣做的原因是方便解密,只需要看最後壹位就能算出原塊的大小是多少。
跟PKCS5Padding的填充方式壹樣,不同的是,PKCS5Padding只是對8字節的進行填充,PKCS7Padding可以對1~256字節大小的block進行填充。openssl裏aes的默認填充方式就是PKCS7Padding
AES有多種加密模式,包括:ECB,CBC,CTR,OCF,CFB,最常見的還是ECB和CBC模式。
最簡單的壹種加密模式,每個塊進行獨立加密,塊與塊之間加密互不影響,這樣就能並行,效率高。
雖然這樣加密很簡單,但是不安全,如果兩個塊的明文壹模壹樣,那麽加密出來的東西也壹模壹樣。
openssl的相關函數:
CBC模式中引入了壹個新的概念,初始向量iv。iv的作用就是為了防止同樣的明文塊被加密成同樣的內容。原理是第壹個明文塊跟初始向量做異或後加密,第二個塊跟第壹個密文塊做異或再加密,依次類推,避免了同樣的塊被加密成同樣的內容。
openssl相關函數:
敲黑板!! 所以跟第三方對接的時候,如果對面說他們用aes加密,務必對他們發起靈魂三問:
簽名的作用是讓接受方驗證妳傳過去的數據沒有被篡改;加密的作用是保證數據不被竊取。
原理:妳有壹個需要被驗簽的原串A。
步驟壹:選擇hash算法將A進行hash得到hash_a;
步驟二:將hash_a進行加密,得到加密值encrypt_a;
步驟三:將原串A和加密的encrypt_a發給第三方,第三方進行驗簽。第三方先解密encrypt_a,得到壹個hash值hash_a1,然後對原串A使用同樣的hash算法進行hash,得到的即為加密前的hash_a,如果hash_a = hash_a1, 那麽驗簽成功。
rsa使用私鑰對信息加密來做簽名,使用公鑰解密去驗簽。
openssl相關函數:
註意:兩個函數中的m,是原串hash後的值,type表示生成m的算法,例如NID_sha256表示使用sha256對原串進行的hash,返回1為簽名成功或者驗簽成功,-1位為失敗。
再次敲黑板!! 所以如果第三方說使用rsa驗簽,要讓對方告知他們的hash算法。
首先明確,私鑰加密不等於簽名。加密的時候,使用使用公鑰加密,第三方使用妳的私鑰進行解密。
openssl裏公鑰加密函數為RSA_public_encrypt,私鑰解密函數為RSA_private_decrypt,具體的可以自己去查看下官方文檔。
rsa也涉及到了填充方式,所以對接的時候也要問清楚
在使用公鑰進行加密時,會發現每次加密出的結果都不壹樣,但使用私鑰加密時,每次的結果都壹樣,網上查了壹圈,說是因為填充方式的原因。
官方文檔說明:
那麽為什麽壹定要使用私鑰做簽名,公鑰做加密,而不是公鑰做簽名,私鑰做加密呢?
舉個栗子: