首页 > 解决方案 > 从 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)

标签: python-3.xencryption

解决方案


TL;DR 分别使用from_bytesto_bytes实现 OS2IP 和 I2OSP。


对于安全加密,您不会直接将 AES 密钥转换为数字。这是因为原始 RSA 在许多方面本质上是不安全的(在撰写本文时该列表并不完整)。

首先,您需要随机填充您的关键字节以获得一个字节数组,该数组将表示一个接近模数的数字。然后您可以执行字节数组转换为数字,然后才应该执行模幂运算。模幂运算也会产生一个数字,您需要将该数字转换为与模数相同大小(以字节为单位)的静态大小的字节数组。

所有这些都在 PKCS#1 RSA 标准中标准化。在 v2.2 中指定了两种方案,称为PKCS#1 v1.5 填充OAEP 填充。第一个很容易实现,但更容易受到填充预言机攻击。OAEP 也很容易受到攻击,但不那么容易。但是,您需要遵循实现提示的细节,尤其是在取消填充期间。

回到您的问题,数字转换称为八位字节字符串到整数原语(OS2IP)和整数到八位字节字符串原语(I2OSP)。然而,这些不是您需要执行的数学运算:它们只是描述了如何表示如何将数字编码为静态大小、大端序、无符号整数。

假设这keysize是以位为单位的密钥大小(模数大小)并且embytesbytearray表示填充密钥,那么您只需执行:

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。

而且您必须执行相同的两个操作才能解密...


推荐阅读