① RSA加密、解密、簽名、驗簽的原理及方法
RSA加密是一種非對稱加密。可以在不直接傳遞密鑰的情況下,完成解密。這能夠確保信息的安全性,避免了直接傳遞密鑰所造成的被破解的風險。是由一對密鑰來進行加解密的過程,分別稱為公鑰和私鑰。兩者之間有數學相關,該加密演算法的原理就是對一極大整數做因數分解的困難性來保證安全性。通常個人保存私鑰,公鑰是公開的(可能同時多人持有)。
加密和簽名都是為了安全性考慮,但略有不同。常有人問加密和簽名是用私鑰還是公鑰?其實都是對加密和簽名的作用有所混淆。簡單的說,加密是為了防止信息被泄露,而簽名是為了防止信息被篡改。這里舉2個例子說明。
RSA的加密過程如下:
RSA簽名的過程如下:
總結:公鑰加密、私鑰解密、私鑰簽名、公鑰驗簽。
RSA加密對明文的長度有所限制,規定需加密的明文最大長度=密鑰長度-11(單位是位元組,即byte),所以在加密和解密的過程中需要分塊進行。而密鑰默認是1024位,即1024位/8位-11=128-11=117位元組。所以默認加密前的明文最大長度117位元組,解密密文最大長度為128字。那麼為啥兩者相差11位元組呢?是因為RSA加密使用到了填充模式(padding),即內容不足117位元組時會自動填滿,用到填充模式自然會佔用一定的位元組,而且這部分位元組也是參與加密的。
② Python RSA簽名、AES密鑰加密
工作中難免會接觸到一些對安全性要求較高的介面,例如銀行的提供的開放介面等。需要將發送的數據進行簽名、加密,再將接收到的數據進行驗簽、解密。接下來講講如何通過Python實現這些功能。
RSA加密演算法是一種非對稱加密演算法,在公開密鑰加密和電子商業中被廣泛使用。要實現RSA加密,首先需要生成一對秘鑰對,公鑰和私鑰。公鑰用於加密消息,可以向被發送對象公開。私鑰用於解密消息,需要由持有人妥善保管。當需要發送私人消息時,使用私鑰進行簽名以證明消息是本人發送的。接收方先使用公鑰進行驗簽,確認消息來自公鑰的所有者,然後使用私鑰解密獲取消息內容。
具體步驟包括:生成秘鑰對,互換公鑰,使用公鑰加密和私鑰解密,以及使用私鑰簽名和公鑰驗簽。Python實現RSA加密依賴於PyCryptodome庫。RSA推薦的密鑰位數為2048位,以保證安全性。實際操作中,加密和解密的流程需要根據具體介面的要求進行調整。
此外,AES加密演算法作為對稱加密標准,被廣泛用於安全通信。它提供了一種區塊加密標准,已經被多方分析且廣為全世界所使用。AES與RSA結合使用,可以實現安全高效的數據傳輸。AES密鑰不能泄露,通常使用RSA私鑰對AES密鑰進行加密,然後將加密後的AES密鑰傳遞給接收方,接收方再用RSA公鑰解密獲取AES密鑰。
在Python中實現AES加解密,需要選擇合適的加密模式,例如ECB模式,並進行補位處理。塊大小需根據密鑰長度確定,例如使用AES-192時,塊大小為24位。
總結起來,實現安全的數據傳輸需要結合使用非對稱加密(如RSA)進行數據簽名和公鑰加密,以及對稱加密(如AES)進行數據加密。Python提供了豐富的庫支持,使得實現這些功能變得相對容易。在實際應用中,還需要根據具體需求進行調整和優化。
③ 小程序RSA加密、解密、加簽、驗簽
npm install wxapp_rsa
var RSA = require('/wxapp_rsa.js')
// RSA加簽
var sign_rsa = new RSA.RSAKey();
//privateKey_pkcs1需要是-----BEGIN PRIVATE KEY-----開頭的私鑰
sign_rsa = RSA.KEYUTIL.getKey(privateKey_pkcs1);
console.log('簽名RSA:')
console.log(sign_rsa)
var hashAlg = 'MD5withRSA';
var hSig = sign_rsa.signString("12345678901234567890", hashAlg);
hSig = RSA.hex2b64(hSig); // hex 轉 b64
console.log("簽名結果:" + hSig)
// RSA 驗簽
var verify_rsa = new RSA.RSAKey();
verify_rsa = RSA.KEYUTIL.getKey(publicKey_pkcs1);
console.log('驗簽RSA:')
console.log(verify_rsa)
hSig = RSA.b64tohex(hSig)
var ver = verify_rsa.verifyString("12345678901234567890", hSig)
console.log('驗簽結果:' + ver)
// RSA加密 【加密欄位長度不大於117】
var encrypt_rsa = new RSA.RSAKey();
encrypt_rsa = RSA.KEYUTIL.getKey(rsa_public_key);
console.log('加密RSA:')
console.log(encrypt_rsa)
var encStr = encrypt_rsa.encrypt('1234567890')
console.log(encStr)
encStr = RSA.hex2b64(encStr);
console.log("加密結果:" + encStr)
// RSA 解密
var decrypt_rsa = new RSA.RSAKey();
decrypt_rsa = RSA.KEYUTIL.getKey(rsa_public_key_private);
console.log('解密RSA:')
console.log(decrypt_rsa)
encStr = RSA.b64tohex(encStr)
var decStr = decrypt_rsa.decrypt(encStr)
console.log("解密結果:" + decStr)
④ RSA-based Locally Verifiable Aggregate Signature
RSAbased Locally Verifiable Aggregate Signature是一種結合了RSA公鑰系統和特定數學原理的簽名技術,旨在實現高效的消息集合簽名和安全的本地驗證。以下是關於RSAbased Locally Verifiable Aggregate Signature的詳細解釋:
技術基礎:
簽名生成:
本地驗證問題:
核心改進與安全性:
驗證過程:
總之,RSAbased Locally Verifiable Aggregate Signature通過一系列復雜的數學運算和演算法設計,實現了高效的消息集合簽名和安全的本地驗證,滿足了特定應用場景下的需求。