Python 2.7 i2osp和os2ip的实现
我在大学里有一项工作要做,我必须按照RSA-OAEP规范对RSA进行编码。我的教授给了我一份RFC3447规范的pdf 在pdf中,我有以下内容: I2OSP将非负整数转换为 指定长度 I2OSP(x,xLen) 输入: 要转换的x非负整数 xLen生成的八位字节字符串的预期长度Python 2.7 i2osp和os2ip的实现,python-2.7,cryptography,rsa,pseudocode,Python 2.7,Cryptography,Rsa,Pseudocode,我在大学里有一项工作要做,我必须按照RSA-OAEP规范对RSA进行编码。我的教授给了我一份RFC3447规范的pdf 在pdf中,我有以下内容: I2OSP将非负整数转换为 指定长度 I2OSP(x,xLen) 输入: 要转换的x非负整数 xLen生成的八位字节字符串的预期长度 X = X_1 X_2 ... X_xLen. 输出: X长度为xLen的对应八位字节字符串 错误:“整数太大” 步骤: 如果x>=256^xLen,则输出“整数太大”并停止 将整数x以其唯一的xLen数字表示形式
X = X_1 X_2 ... X_xLen.
输出:
X长度为xLen的对应八位字节字符串
错误:“整数太大”
步骤:
x = x_(xLen-1) 256^(xLen-1) + x_(xLen-2) 256^(xLen-2) + ...
+ x_1 256 + x_0,
其中0TypeScript端口是上面Python代码的端口,以防有人感兴趣:
函数i2osp(x:bigint,xLen:number){
如果(x>=BigInt(256)**BigInt(xLen)){
抛出新错误(“整数太大”);
}
常量八位字节=缓冲区分配(xLen);
八位字节。forEach((u,索引)=>{
八位字节[索引]=个数(x%BigInt(256));
x=x/BigInt(256);
});
返回八位字节。反向();
}
函数os2ip(X:缓冲区){
返回Buffer.from(X).reverse().reduce(
(总计、值、索引)=>(总计+=BigInt(值*256**索引)),
BigInt(0)
);
}
您需要更准确地了解哪些部分让您感到困惑。然而,我们不会为你做家庭作业。这不是我的家庭作业。如前所述,如果您仔细阅读,我的作业是编写一个带有最佳非对称加密方案(rsa-OAEP)的rsa python实现代码。您可以在ietf.org/rfc/rfc3447.txt中查看该文档以了解更多详细信息。我只是不明白读取该文档时该数据转换原语是如何工作的。正如我所说,如果你把伪代码,或解释给我,我会对你很生气,因为我不理解阅读文档如何将整数转换为八位字节字符串,我不想让你或任何人做我的家庭作业…顺便说一下。。。我自己解决了这个问题。多亏了你富有知识的评论,你真是太好了。也许有一天我会请你帮我做作业……基本上,这是一个静态大小的big-endian编码。如果你已经实现了,你可以把它作为一个答案发布。
def i2osp(x, xLen):
if x >= 256**xLen:
raise ValueError("integer too large")
digits = []
while x:
digits.append(int(x % 256))
x //= 256
for i in range(xLen - len(digits)):
digits.append(0)
return digits[::-1]
def os2ip(X):
xLen = len(X)
X = X[::-1]
x = 0
for i in range(xLen):
x += X[i] * 256**i
return x