Python 2.7 i2osp和os2ip的实现

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数字表示形式

我在大学里有一项工作要做,我必须按照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数字表示形式写入 基数256:

     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