我需要在大学里做一些工作,我必须按照RSA-OAEP规范对RSA进行编码。我的教授给我一份带有RFC 3447规范的pdf。
在pdf中我有以下内容:
I2OSP将非负整数转换为a的八位字节串 指定长度。
I2OSP(x,xLen)
输入: x要转换的非负整数 xLen生成的八位字节串的预期长度
输出: X对应的长度为xLen的八位字节串
错误:“整数太大”
步骤:
如果x> = 256 ^ xLen,输出“整数太大”并停止。
将整数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),则为零。
令八位字节X_i具有整数值x_(xLen-i)1 <= i <= XLEN。输出八位字符串
X = X_1 X_2 ... X_xLen.
4.2 OS2IP
OS2IP将八位字节字符串转换为非负整数。
OS2IP(X)
输入: 要转换的X八位字符串
输出: x对应的非负整数
步骤:
设X_1 X_2 ... X_xLen是从头到尾的X的八位字节, 并且让x_(xLen-i)为八位位组X_i的整数值 1&lt; = i&lt; = xLen。
设x = x_(xLen-1)256 ^(xLen-1)+ x_(xLen-2)256 ^(xLen-2)+ ...
输出x。
但是我无法理解这个伪代码,有人可以给我一个解释我是怎么做到的吗?答案可以是伪代码或python实现。
答案 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)
);
}