python3实现RSA/ECB/NOPADDING公钥加密

import rsa
import base64
from Crypto.PublicKey import RSA

def zfillStrToBin(s):
    b=bytes(s.encode())
    for i in range(128-len(b)):
        b+=b'\0'
    print(len(b))
    return b

class RsaNopadding:

    def __init__(self,key):
        self.pubkey = RSA.importKey(base64.b64decode(key))

    def encrypt(self, message):
        kLen = rsa.common.byte_size(self.pubkey.n)
        msg = zfillStrToBin(message)
        _b = rsa.transform.bytes2int(msg)
        _i = rsa.core.encrypt_int(_b, self.pubkey.e, self.pubkey.n)
        result = rsa.transform.int2bytes(_i, kLen)
        return result.hex().upper()

message='{"code":"123451","clienttime":1564560057}'
msg = RsaNopadding("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2DT4odzkDd7hMlZ7djdZQH12j38nKxriINW1MGjMry3tXheya113xwmbBOwN0GA4zTwKFauFJRzcsD0nDFq1eaatcFKeDF25R4dnQRX+4BdTwFVS8lIb8nJMluSBwK+i4Z3VF+gfZ0AqQOXda6lJ4jPBt9Ep7VXEAHXUDn9JM8wIDAQAB")
print(msg.encrypt(message))

对应的java的  Cipher.getInstance("RSA/ECB/NOPADDING")加密,尝试了挺久的,一直没办法做到和java安卓的这个算法一致,参考了网上的一些资料,最终总结了上面的代码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于该问题需要一定的编程实现,建议您将其分为几个部分逐一完成。以下是一个整体框架示例,每个部分具体实现需要根据具体情况进行修改和完善。 1. 导入必要的库 ```python import random from Crypto.Cipher import AES, DES from Crypto.PublicKey import RSA from Crypto.Util.Padding import pad, unpad ``` 2. Diffie-Hellman密码协商协议生成DES加密密钥 ```python # Alice和Bob事先约定好素数p和原根g p = 23 g = 5 # Alice和Bob各自生成私钥a和b,并计算公钥A和B a = random.randint(1, p - 1) A = pow(g, a, p) b = random.randint(1, p - 1) B = pow(g, b, p) # Alice和Bob交换公钥,并计算出共享密钥K K1 = pow(B, a, p) K2 = pow(A, b, p) # 确认两个密钥相同 assert K1 == K2 # 生成DES加密密钥,长度为8字节 des_key = K1.to_bytes(8, byteorder='big') ``` 3. 使用DES算法加密通信内容 ```python # 明文消息 message = b"Hello, Bob!" # 创建DES加密器 des_cipher = DES.new(des_key, DES.MODE_ECB) # 加密明文消息 ciphertext = des_cipher.encrypt(pad(message, DES.block_size)) ``` 4. 使用AES算法加密通信内容 ```python # 明文消息 message = b"Hello, Bob!" # 生成随机的128位密钥 aes_key = bytes([random.randint(0, 255) for i in range(16)]) # 创建AES加密器 aes_cipher = AES.new(aes_key, AES.MODE_ECB) # 加密明文消息 ciphertext = aes_cipher.encrypt(pad(message, AES.block_size)) ``` 5. 使用RSA算法生成公私钥对,并发送公钥给Bob ```python # 生成RSA公私钥对,模数长度为1024比特 rsa_key = RSA.generate(1024) # 获取RSA公钥 rsa_public_key = rsa_key.publickey().export_key() # 发送公钥给Bob # TODO: 实现发送公钥的代码 ``` 6. Bob接收到Alice的公钥后,使用RSA算法加密AES密钥 ```python # 假设Bob已经接收到了Alice的公钥rsa_public_key # 从Alice的公钥中恢复RSA公钥对象 rsa_public_key = RSA.import_key(rsa_public_key) # 使用RSA公钥加密AES密钥 encrypted_aes_key = rsa_public_key.encrypt(aes_key, None)[0] # 发送加密后的AES密钥给Alice # TODO: 实现发送加密后的AES密钥的代码 ``` 7. Alice接收到Bob发送的加密后的AES密钥后,使用RSA算法解密AES密钥 ```python # 假设Alice已经接收到了Bob发送的加密后的AES密钥encrypted_aes_key # 使用RSA私钥解密AES密钥 rsa_cipher = RSA.import_key(rsa_key.export_key()) decrypted_aes_key = rsa_cipher.decrypt(encrypted_aes_key) # 创建AES解密器 aes_cipher = AES.new(decrypted_aes_key, AES.MODE_ECB) # 解密密文消息 message = unpad(aes_cipher.decrypt(ciphertext), AES.block_size) ``` 8. 验证自动生成的密钥和加解密正确的结果 ```python # 验证DES加密解密结果是否正确 assert des_cipher.decrypt(ciphertext) == pad(message, DES.block_size) # 验证AES加密解密结果是否正确 assert aes_cipher.decrypt(ciphertext) == pad(message, AES.block_size) ``` 9. 设计好界面(不一定图形),可验证自动生成的密钥和加解密正确的结果 由于界面实现方式多种多样,这里不做具体展示。建议考虑使用Python的GUI库,如Tkinter、PyQt等,实现一个简单的界面,包括按钮、文本框等控件,用于输入明文消息、加密密钥等信息,点击按钮后展示加密后的密文和解密后的明文,以及验证结果是否正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值