i2osp和os2ip

时间:2016-10-10 18:18:33

标签: python-2.7 cryptography rsa pseudocode

我需要在大学里做一些工作,我必须按照RSA-OAEP规范对RSA进行编码。我的教授给我一份带有RFC 3447规范的pdf。

在pdf中我有以下内容:

I2OSP将非负整数转换为a的八位字节串    指定长度。

I2OSP(x,xLen)

输入:    x要转换的非负整数    xLen生成的八位字节串的预期长度

输出:    X对应的长度为xLen的八位字节串

错误:“整数太大”

步骤:

  1. 如果x> = 256 ^ xLen,输出“整数太大”并停止。

  2. 将整数x写入其唯一的xLen-digit表示中   基数256:

     x = x_(xLen-1) 256^(xLen-1) + x_(xLen-2) 256^(xLen-2) + ...
     + x_1 256 + x_0,
    

    其中0 <= x_i&lt; 256(注意一个或多个前导数字将是   如果x小于256 ^(xLen-1),则为零。

  3. 令八位字节X_i具有整数值x_(xLen-i)1 <= i <=   XLEN。输出八位字符串

     X = X_1 X_2 ... X_xLen.
    
  4. 4.2 OS2IP

    OS2IP将八位字节字符串转换为非负整数。

    OS2IP(X)

    输入:    要转换的X八位字符串

    输出:    x对应的非负整数

    步骤:

    1. 设X_1 X_2 ... X_xLen是从头到尾的X的八位字节,   并且让x_(xLen-i)为八位位组X_i的整数值   1&lt; = i&lt; = xLen。

    2. 设x = x_(xLen-1)256 ^(xLen-1)+ x_(xLen-2)256 ^(xLen-2)+ ...

      • x_1 256 + x_0。
    3. 输出x。

    4. 但是我无法理解这个伪代码,有人可以给我一个解释我是怎么做到的吗?答案可以是伪代码或python实现。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

上面的Python代码的TypeScript端口,以防万一:

function i2osp(x: bigint, xLen: number) {
  if (x >= BigInt(256) ** BigInt(xLen)) {
    throw new Error("integer too large");
  }
  const octets = Buffer.alloc(xLen);
  octets.forEach((_, index) => {
    octets[index] = Number(x % BigInt(256));
    x = x / BigInt(256);
  });
  return octets.reverse();
}

function os2ip(X: Buffer) {
  return Buffer.from(X).reverse().reduce(
    (total, value, index) => (total += BigInt(value * 256 ** index)),
    BigInt(0)
  );
}