摘要:我們只考慮能解密就行明文公鑰加密,私鑰解密密文明文公鑰私鑰使用生成格式的公鑰私鑰文件。直接使用該密鑰需要轉(zhuǎn)換為格式公鑰私鑰,密鑰字符串不需要。庫安裝會有環(huán)境問題,直接安裝成功,安裝失敗。
記錄一次項目使用RSA加解密
項目使用Java和Python在開發(fā),RSA加密解密互通代碼:
Python代碼# -*- coding: utf-8 -*- """ RSA加解密 """ import base64 from M2Crypto import BIO, RSA with open("public_key.pem", "r") as f: pubkey = f.read() with open("private_key.pem", "r") as f: prikey = f.read() # 加密 text = "ABCDEF".encode("utf-8") # 明文 pub_bio = BIO.MemoryBuffer(pubkey.encode("utf-8")) # 公鑰字符串 pub_rsa = RSA.load_pub_key_bio(pub_bio) # 加載公鑰 secret = pub_rsa.public_encrypt(text, RSA.pkcs1_padding) # 公鑰加密 sign = base64.b64encode(secret) # 密文base64編碼 print(sign) # 解密 b64_sign = "uhBqhevT0E5+WT++HX+pGzSy7YGskBQODuvoV+hf0k8cSyXG/GuAT4LKYaCiT9qiEGlbWxCIH51Qt1s0y2X56TbNja93AbzXiFWzsC2H6vwo3ZFcoj+YqUBsax+Gad0I6NME9lalpKsPtWqi4W/b3VbG5Mx+WBJ+L17GR7ZvWMo=" # base64密文 cipher = base64.b64decode(b64_sign) # base64解碼 pri_bio = BIO.MemoryBuffer(prikey.encode("utf-8")) # 加載私鑰 pri_rsa = RSA.load_key_bio(pri_bio) plain = pri_rsa.private_decrypt(cipher, RSA.pkcs1_padding) # 解密 print(plain.decode("utf-8"))Java代碼
import java.security.Key; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import javax.crypto.Cipher; public class rsa_demo { public String encryptoMode ="RSA/ECB/PKCS1Padding"; //public String encryptoMode ="RSA/ECB/NoPadding"; private String priKey="私鑰字符串"; private String pubKey="公鑰字符串"; public String sign_str = "123456" ; /*** * 秘鑰的來源方式 openssl 生成 */ /** * 獲得公鑰 * @return * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */ private PublicKey getPublicKey(String pubKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException { byte[] pubKeyByte = Base64.getDecoder().decode(pubKey); X509EncodedKeySpec spec = new X509EncodedKeySpec(pubKeyByte); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey pubkey = keyFactory.generatePublic(spec); return pubkey; } /** * 獲得私鑰 * @return */ private PrivateKey getPrivateKey(String priKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException { byte[] priKeyByte = Base64.getDecoder().decode(priKey); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(priKeyByte); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey priKey = keyFactory.generatePrivate(spec); return priKey; } /** * 公鑰加密 (私鑰加密) */ public String encrypto(String text,Key key) { try{ Cipher cipher = Cipher.getInstance(encryptoMode); cipher.init(Cipher.ENCRYPT_MODE, key); byte tempBytes[] = cipher.doFinal(text.getBytes()); String secretText=Base64.getEncoder().encodeToString(tempBytes); return secretText; }catch(Exception e){ throw new RuntimeException("加密字符串[" + text + "]時遇到異常", e); } } /** * 私鑰解密(公鑰解密) * @param secretText */ public String decrypto(String secretText,Key key) { try{ //生成公鑰 Cipher cipher = Cipher.getInstance(encryptoMode); cipher.init(Cipher.DECRYPT_MODE, key); // 密文解碼 byte[] secretText_decode = Base64.getDecoder().decode(secretText.getBytes()); byte tempBytes[] = cipher.doFinal(secretText_decode); String text=new String( tempBytes); return text; }catch(Exception e){ throw new RuntimeException("解密字符串[" + secretText + "]時遇到異常", e); } } /** * 由于每次公鑰 加密出來的結(jié)果都不一樣,所有python java 每次加密出來的結(jié)果都不一樣,也就沒有可比性。我們只考慮能解密就行 * @param args */ public static void main(String[] args) throws Exception { rsa_demo rsa = new rsa_demo(); System.err.println("明文:"+rsa.sign_str); PublicKey pubkey = rsa.getPublicKey(rsa.pubKey); PrivateKey prikey = rsa.getPrivateKey(rsa.priKey); String secretText = rsa.encrypto(rsa.sign_str,pubkey);//公鑰加密,私鑰解密 secretText="Lm9PN4oM1dl17d2XFYRIs+hDV6RkGPVYBjgYAglaj020v5RnYzClHUN6lOVBzpeYKyH1MY5JzyOfxuYZHKCupVqhcvY4+zx+jowBH2nbVp1+/OrzuiPkNivfvmEad6ImAZp5/3Y/dVafABm5xZE78j7Ytlv0ak4seXMGTisU39o="; System.out.println("密文:"+secretText); String text = rsa.decrypto(secretText,prikey); System.out.println("明文:"+text); } }note
1 公鑰私鑰:使用openssl生成pkcs#1格式的公鑰私鑰pem文件。python直接使用該密鑰;Java需要轉(zhuǎn)換為pkcs#8格式公鑰私鑰,密鑰字符串不需要BEGIN/END。 2 python可以將公鑰私鑰的字符串直接保存使用,避免每次讀pem文件。 3 M2Crypto庫安裝會有環(huán)境問題,centOS直接pip安裝成功,Ubuntu安裝失敗。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42623.html
摘要:加解密中必須考慮到的密鑰長度明文長度和密文長度問題。而只要用到,那么就要占用實際的明文長度,于是實際明文長度需要減去字節(jié)長度。所以如果要對任意長度的數(shù)據(jù)進行加密,就需要將數(shù)據(jù)分段后進行逐一加密,并將結(jié)果進行拼接。 RSA加解密中必須考慮到的密鑰長度、明文長度和密文長度問題。明文長度需要小于密鑰長度,而密文長度則等于密鑰長度。因此當加密內(nèi)容長度大于密鑰長度時,有效的RSA加解密就需要對內(nèi)...
摘要:加解密中必須考慮到的密鑰長度明文長度和密文長度問題。而只要用到,那么就要占用實際的明文長度,于是實際明文長度需要減去字節(jié)長度。所以如果要對任意長度的數(shù)據(jù)進行加密,就需要將數(shù)據(jù)分段后進行逐一加密,并將結(jié)果進行拼接。 RSA加解密中必須考慮到的密鑰長度、明文長度和密文長度問題。明文長度需要小于密鑰長度,而密文長度則等于密鑰長度。因此當加密內(nèi)容長度大于密鑰長度時,有效的RSA加解密就需要對內(nèi)...
摘要:最近在寫接口的時候,遇到了需要使用加密和加密的情況,對方公司提供的都是的,我需要用來實現(xiàn)。于是,小明通過事先老板給他的公鑰來加密情報。使用對方公司的公鑰對所有的參數(shù)進行加密,加密之后進行編碼。 最近在寫接口的時候,遇到了需要使用RSA加密和PBE加密的情況,對方公司提供的DEMO都是JAVA的,我需要用python來實現(xiàn)。在網(wǎng)上搜了一下,python的RSA加密這塊寫的還是比較多的,但...
現(xiàn)如今,各行各業(yè)都會用到各種各樣的算法,包括我們在使用Python的時候,也會使用到各種各樣的算法,比如,我們會使用到各種的加密算法,那么,到底什么才是加密算法呢?下面就給大家詳細解答下。 序言 下面小編就和大家一起來盤點下數(shù)據(jù)收集環(huán)節(jié)中這一些熱門的密碼算法,這些有什么特點、數(shù)據(jù)加密的形式有哪些方面這些,了解了這一些以后其實對于我們反向破譯這一些數(shù)據(jù)加密的主要參數(shù)可以起到很多的協(xié)助! 相...
閱讀 2468·2021-11-22 15:35
閱讀 3761·2021-11-04 16:14
閱讀 2689·2021-10-20 13:47
閱讀 2501·2021-10-13 09:49
閱讀 2072·2019-08-30 14:09
閱讀 2369·2019-08-26 13:49
閱讀 883·2019-08-26 10:45
閱讀 2772·2019-08-23 17:54