Javascript 当calc.pow()时(使用npm大整数),为什么bigInt给出不同的结果?如何解密给定的数字?

Javascript 当calc.pow()时(使用npm大整数),为什么bigInt给出不同的结果?如何解密给定的数字?,javascript,encryption,biginteger,Javascript,Encryption,Biginteger,我正试图解密我的加密号码 带函数 function decrypt(arg){ let encrypNum = bigInt(arg).pow(dNum(eNum,eValue)) let result = encrypNum%b return result } 在值中,它如下所示: 加密值为7 结果=7。功率(103)%143 它应该返回123,但仍然返回38。我认为这个数字太大了,所以我使用了bigInt方法,但它仍然返回38 解决方案应该是(以下不是代码,它的smth类似

我正试图解密我的加密号码

带函数

function decrypt(arg){
  let encrypNum =  bigInt(arg).pow(dNum(eNum,eValue)) 
  let result = encrypNum%b
  return result
}
在值中,它如下所示:

加密值为7

结果=7。功率(103)%143 它应该返回123,但仍然返回38。我认为这个数字太大了,所以我使用了bigInt方法,但它仍然返回38

解决方案应该是(以下不是代码,它的smth类似于伪代码,因为我不知道如何在软件中编写数学。抱歉,我会解决这个问题): 7.pow(103)mod 143=7.pow(64)*7.pow(32)*7.pow(4)*7.pow(2)*7.pow(1)mod 143

等于

113×16×113×49×7模143=123

但是为什么我的bigInt方法不起作用,为什么它们显示不同的结果?如果第二种方法是正确的方法,那么如何在代码中实现它

第一个代码:

function decrypt(arg){
  let encrypNum = Math.pow(arg,dNum(eNum,eValue))
  let result = encrypNum%b
  return result
}

JavaScript
%
运算符仅适用于普通JS编号(即IEEE 754),而不适用于
bigInt
对象。因此,当您尝试将
%
应用于
bigInt
时,它首先转换为浮点。如果
bigInt
太大,无法用双精度浮点精确表示,则其最低位将被舍入,从而放弃依赖于它们的任何计算(如
%

一般的解决方案是使用
.mod()
方法,而不是本机JavaScript
%
操作符。但是,对于的特定情况,您应该使用
.modPow()
方法,因为它比执行完整的
.pow()
计算,然后对结果应用
.mod()
更有效(至少对于通常用于RSA加密的大数类型而言;可能不适用于此玩具示例)

下面是一个堆栈片段,演示了这些不同的操作:

console.log('bigInt(7.pow(103)=',bigInt(7.pow(103));
log('bigInt(7.pow(103.mod)(143)=',bigInt(7.pow(103.mod)(143));
log('bigInt(7.modPow(103143)=',bigInt(7.modPow(103143));
console.log('Number(bigInt(7.pow(103))=',Number(bigInt(7.pow(103)));
log('Number(bigInt(7.pow(103))%143=',Number(bigInt(7.pow(103))%143);
log('bigInt(7.pow(103)%143=',bigInt(7.pow(103)%143))

您的
bigInt
函数是什么?它似乎与之无关,即
BigInt
,而不是
BigInt
。JavaScript数字没有
pow
函数。(也不是BigInt)你已经标记了,你是指别的什么吗?你的代码看起来像JavaScript,但是…谢谢你的回答。我是说javascript。当然可能是我误解了smth。我在这里找到了这个方法,我建议编辑这个问题,明确地说您正在使用
大整数
npm
模块,并更新您的“result=7.pow(103)%143,它应该返回123,但仍然返回38。”因为这不是有效的JavaScript,当它无效时很难判断你在做什么。可能值得注意的是,
%
不是模运算符,它是一个余数运算符,如果你使用的是负数,这会产生影响。根据mod应该work@Populus,如果您使用的是该页面上描述的本机BigInt对象,则会发生这种情况。问这个问题的用户使用的是不喜欢原生Bigint(在支持它们的JS版本中)的特殊语法支持的浏览器。值得一提的是,关于旧浏览器:通常,可以使用Babel之类的工具来解决缺少的globals等问题,您可能已经在将其用于其他语言功能。但是本机
BigInt
不能仅使用垫片添加,因为它需要运算符重载。我不知道是否有办法解决这个问题。因此,如果您在旧浏览器中依赖Babel或其他东西,您应该确保在承诺使用本机
BigInt
之前,它可以正常工作。