python-3.x - 从 Python3 中的字节字符串中获取整数值
问题描述
我正在实施一个 RSA 和 AES 文件加密程序。到目前为止,我已经实现了 RSA 和 AES。但是,我希望了解的是,如果我的 AES 实现使用 16 字节密钥(由 os.urandom(16) 获得),我如何从中获取整数值以使用 RSA 进行加密?
本质上,如果我有一个像
b',\x84\x9f\xfc\xdd\xa8A\xa7\xcb\x07v\xc9`\xefu\x81'
如何从此字节字符串(AES 密钥)中获取一个整数,该整数随后可用于使用(RSA)进行加密?
加密流程
加密文件(AES 密钥)-> 加密 AES 密钥(使用 RSA)
解决方案
TL;DR 分别使用from_bytes
和to_bytes
实现 OS2IP 和 I2OSP。
对于安全加密,您不会直接将 AES 密钥转换为数字。这是因为原始 RSA 在许多方面本质上是不安全的(在撰写本文时该列表并不完整)。
首先,您需要随机填充您的关键字节以获得一个字节数组,该数组将表示一个接近模数的数字。然后您可以执行字节数组转换为数字,然后才应该执行模幂运算。模幂运算也会产生一个数字,您需要将该数字转换为与模数相同大小(以字节为单位)的静态大小的字节数组。
所有这些都在 PKCS#1 RSA 标准中标准化。在 v2.2 中指定了两种方案,称为PKCS#1 v1.5 填充和OAEP 填充。第一个很容易实现,但更容易受到填充预言机攻击。OAEP 也很容易受到攻击,但不那么容易。但是,您需要遵循实现提示的细节,尤其是在取消填充期间。
回到您的问题,数字转换称为八位字节字符串到整数原语(OS2IP)和整数到八位字节字符串原语(I2OSP)。然而,这些不是您需要执行的数学运算:它们只是描述了如何表示如何将数字编码为静态大小、大端序、无符号整数。
假设这keysize
是以位为单位的密钥大小(模数大小)并且em
是bytes
或bytearray
表示填充密钥,那么您只需执行:
m = int.from_bytes(em, byteorder='big', signed=False)
对于 OS2IP,其中m
将是模幂运算的输入,然后使用:
k = (keysize + 8 - 1) / 8
em = m.to_bytes(k, byteorder='big', signed=False)
对于 I2OSP。
而且您必须执行相同的两个操作才能解密...
推荐阅读
- node.js - Jasmine - 如何从规范覆盖范围中排除 node_modules
- python - 故障:在 EbxmlMessage 中指定的操作不存在
- r - 在 R 中创建“元数据”字段
- ionic-framework - 如何在使用 NavController 的 app.html 上使用 Ionic 3 组件?
- html - 为什么图像没有正确分离?
- android - 资源“attr/layout_anchorGravity”的重复值与配置“”
- android - 在 react native 中,accessibilityLabel 属性有什么作用?
- android - 检索 ro.product.cpu.abi 的设备属性时出错:
- c - scanf 未知数量的整数,如何结束循环?
- c# - 在不知道谁是父级的情况下从父级删除视图