python实现rsa数据加密_python实现RSA与AES混合加密

RSA加密

这是一种非对称加密算法,密钥分为公钥和私钥。通常私钥长度有512bit,1024bit,2048bit,4096bit,长度越长,越安全,但是生成密钥越慢,加解密也越耗时。一般公钥用来加密数据,私钥用来解密数据,并且为防止有人冒充发送密文,私钥又可以负责签名,公钥负责验证。公钥可以分发给其他系统,但是私钥一般保存在唯一的系统中。

AES加密

这是一种对称加密算法,加密和解密公用同一密钥。密钥最长只有256个bit,执行速度快,易于硬件实现。通常发送方使用密钥加密数据后会使用口令对密钥进行加密,然后把密文和加密后的密钥一同发送给接收方,接收方接收到数据后首先使用口令对密钥进行解密,在使用密钥对密文进行解密。

以上两种加密方式都有各自的特点,在互联网领域有着广泛的应用,我们需要根据不同的场景使用不同的加密解密方案。

一般需要加密传输的时候存在以下两种场景:

客户端发送加密数据,服务端解密后返回明文:

例如用户在客户端提交个人信息时,客户端把个人信息加密后发送给服务端,服务端再返回code或者提交成功的提示

客户端发送加密数据,服务端解密后同样返回密文

例如用户登录时,客户端发送加密后的账号密码,服务端解密后生成对应的token,并且对token进行加密,客户端收到返回的token再对其进行解密

如何在python实现RSA?

可以直接用python的rsa库

import rsa

(pubkey, privkey) = rsa.newkeys(1024)

print('公钥:\n%s' % pubkey)

print('私钥:\n%s' % privkey)

message = 'hello'

encrypt_text = rsa.encrypt(message.encode(), pubkey)

print('加密后的密文:\n%s' % encrypt_text)

decrypt_text = rsa.decrypt(encrypt_text, privkey)

print('解密后的明文:\n%s' % decrypt_text)

23d78e0a5e23

运行结果

但是这只是简单的实现,中间省去了很多细节,这就导致我们以后跨语言加密解密的时候可能会出问题。比如java在实现RSA加密解密的时候有很多参数需要设置,如果java和python之间的参数不能保持一致,则会导致用java加密的密文用python解密不了,或者用python加密的密文用java解密不了。所以还是推荐使用可以设置更多参数的第三方RSA库。python的第三方RSA库有crypto、pycrypto和pycryptodome。crypto不推荐使用,已经停止维护了。可以使用pycrypto,不过我的电脑安装pycrypto会报错。

23d78e0a5e23

错误信息

提示我安装Microsoft Visual C++ 14.0,所以我直接用的pycryptodome,其实都差不多。

Config配置类

class Config:

PUBLIC_KEY = '''

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDv/LnAoDkyewwjwqwgi9VSg51F

+tUJ8cGwL6Rqdf5ZXrRCHI1KLjOxdFbzB81YjS76cOzezQRz2vuYDo7OvLfYSjFI

fmukUxN+EliKkg0TwswylVroLBW9OKN70Zd62dc+gfkA3Vu8cDoRKzz6BKpo4yDo

0D3FOsbNEj80opjmtQIDAQAB

'''

PRIVATE_KEY = '''

MIICXAIBAAKBgQDv/LnAoDkyewwjwqwgi9VSg51F+tUJ8cGwL6Rqdf5ZXrRCHI1K

LjOxdFbzB81YjS76cOzezQRz2vuYDo7OvLfYSjFIfmukUxN+EliKkg0TwswylVro

LBW9OKN70Zd62dc+gfkA3Vu8cDoRKzz6BKpo4yDo0D3FOsbNEj80opjmtQIDAQAB

AoGADuZtDgWkp3q2TT4X+8lSzFW5nQ+uzHhDI1JB7g43ZYsYvAYTy6hEs17ayyoP

2NCjOw9p1Yd7IEpXVqCIw1M6QsfGdshy1NStsGpDHQYBBd8XiT8cWUaT/nmq5dEs

i0wOITMZePLgI5/5pD4M6DIEJKskM+Rzlo47AiyRchL6pqECQQD+XAZNCl6R5wjI

DrqW4v6Vw8mhdaPnQhPexmhHa1f9D7sA32A2H2N8M3dUDOwuG+DJhPkjVaQtFvT8

mjDjSZTdAkEA8Yj4hncF/WnLTDSXmiWfpNwYwjfpjOj8e4/5rWHF1jWZMgl0l1AS

Otna2dIbXp64dqsInITJTIDSQpbxuhrvuQJBAN9Ee6toLLa5KzYf55zGR13Ca9wz

3NkDYVmsop/+E0/oXOdZK6SWTMcajeXTKgUXJ2r8M4vWgrOpcQXBeqQnVGkCQDYX

e7j5bOD80Wemm5EM/fy4wd61ENvazbiKXNske17msAFRtsewSfTeFzIS6Mg++Yax

9QLAhihY7T22ejo4kBkCQBdg2yKHQrmG+njGfLsdQG9MARFlnOfohoBFQTYdtrmf

5JRNfwtPiis2YaoM2gP7z2qaunYbibDV5SYmtdD8GK0=

'''

RSA工具类

import base64

from Crypto.Cipher import PKCS1_OAEP

from Crypto.Hash import SHA256

from Crypto.PublicKey import RSA

from Crypto.Signature import PKCS1_v1

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AESRSA混合加密是一种常见的加密方式,它结合了AES(对称加密)和RSA(非对称加密)两种加密算法。下面是一个Java示例代码,演示如何使用AESRSA混合加密: ```java import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; public class AESRSACipher { private static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding"; private static final String RSA_ALGORITHM = "RSA"; // 生成RSA公私钥对 public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM); keyPairGenerator.initialize(2048); // 设置RSA密钥长度为2048位 return keyPairGenerator.generateKeyPair(); } // 使用AES加密明文,并返回加密后的密文和IV public static byte[][] encryptAES(byte[] plaintext, SecretKeySpec key) throws Exception { Cipher cipher = Cipher.getInstance(AES_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key); AlgorithmParameters params = cipher.getParameters(); byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); byte[] ciphertext = cipher.doFinal(plaintext); return new byte[][] { ciphertext, iv }; } // 使用RSA公钥加密AES密钥,并返回加密后的密文 public static byte[] encryptRSA(byte[] keyBytes, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] ciphertext = cipher.doFinal(keyBytes); return ciphertext; } // 使用RSA私钥解密AES密钥,并返回解密后的明文 public static byte[] decryptRSA(byte[] keyBytes, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] plaintext = cipher.doFinal(keyBytes); return plaintext; } // 使用AES解密密文,并返回解密后的明文 public static byte[] decryptAES(byte[] ciphertext, byte[] iv, SecretKeySpec key) throws Exception { Cipher cipher = Cipher.getInstance(AES_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); byte[] plaintext = cipher.doFinal(ciphertext); return plaintext; } public static void main(String[] args) throws Exception { // 生成RSA公私钥对 KeyPair keyPair = generateRSAKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); // 准备待加密数据和密钥 String plaintext = "Hello, world!"; byte[] aesKeyBytes = new byte[16]; // AES密钥长度为128位 SecretKeySpec aesKey = new SecretKeySpec(aesKeyBytes, "AES"); // 使用AES加密明文,并返回加密后的密文和IV byte[][] aesCiphertextAndIV = encryptAES(plaintext.getBytes(), aesKey); byte[] aesCiphertext = aesCiphertextAndIV[0]; byte[] iv = aesCiphertextAndIV[1]; // 使用RSA公钥加密AES密钥,并返回加密后的密文 byte[] rsaCiphertext = encryptRSA(aesKeyBytes, publicKey); // 使用RSA私钥解密AES密钥,并返回解密后的明文 byte[] aesKeyBytesDecrypted = decryptRSA(rsaCiphertext, privateKey); SecretKeySpec aesKeyDecrypted = new SecretKeySpec(aesKeyBytesDecrypted, "AES"); // 使用AES解密密文,并返回解密后的明文 byte[] plaintextDecrypted = decryptAES(aesCiphertext, iv, aesKeyDecrypted); System.out.println(new String(plaintextDecrypted)); // 输出明文 } } ``` 上述代码中,我们首先生成了RSA公私钥对。接着,我们使用AES加密明文,并使用RSA公钥加密AES密钥,将加密后的AES密钥与密文一起发送给接收方。接收方使用RSA私钥解密AES密钥,再使用AES解密密文,从而得到明文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值