资讯专栏INFORMATION COLUMN

Python&Java互通rsa加密解密

Arno / 1431人阅读

摘要:我们只考虑能解密就行明文公钥加密,私钥解密密文明文公钥私钥使用生成格式的公钥私钥文件。直接使用该密钥需要转换为格式公钥私钥,密钥字符串不需要。库安装会有环境问题,直接安装成功,安装失败。

记录一次项目使用RSA加解密

项目使用Java和Python在开发,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);
            }
     }
    /**
     * 由于每次公钥 加密出来的结果都不一样,所有python java 每次加密出来的结果都不一样,也就没有可比性。我们只考虑能解密就行 
     * @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需要转换为pkcs#8格式公钥私钥,密钥字符串不需要BEGIN/END。
2 python可以将公钥私钥的字符串直接保存使用,避免每次读pem文件。
3 M2Crypto库安装会有环境问题,centOS直接pip安装成功,Ubuntu安装失败。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42623.html

相关文章

  • RSA加密解密(无数据大小限制,php、go、java互通实现)

    摘要:加解密中必须考虑到的密钥长度明文长度和密文长度问题。而只要用到,那么就要占用实际的明文长度,于是实际明文长度需要减去字节长度。所以如果要对任意长度的数据进行加密,就需要将数据分段后进行逐一加密,并将结果进行拼接。 RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内...

    whjin 评论0 收藏0
  • RSA加密解密(无数据大小限制,php、go、java互通实现)

    摘要:加解密中必须考虑到的密钥长度明文长度和密文长度问题。而只要用到,那么就要占用实际的明文长度,于是实际明文长度需要减去字节长度。所以如果要对任意长度的数据进行加密,就需要将数据分段后进行逐一加密,并将结果进行拼接。 RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内...

    RobinQu 评论0 收藏0
  • PythonRSA加密和PBE加密

    摘要:最近在写接口的时候,遇到了需要使用加密和加密的情况,对方公司提供的都是的,我需要用来实现。于是,小明通过事先老板给他的公钥来加密情报。使用对方公司的公钥对所有的参数进行加密,加密之后进行编码。 最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现。在网上搜了一下,python的RSA加密这块写的还是比较多的,但...

    Tony_Zby 评论0 收藏0
  • 盘点Python爬虫中的常见加密算法

      现如今,各行各业都会用到各种各样的算法,包括我们在使用Python的时候,也会使用到各种各样的算法,比如,我们会使用到各种的加密算法,那么,到底什么才是加密算法呢?下面就给大家详细解答下。  序言  下面小编就和大家一起来盘点下数据收集环节中这一些热门的密码算法,这些有什么特点、数据加密的形式有哪些方面这些,了解了这一些以后其实对于我们反向破译这一些数据加密的主要参数可以起到很多的协助!  相...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<