Java实现仿射密码调用BigInteger.modInverse报静态引用错误如何解决
错误原因
modInverse()是BigInteger类的实例方法,必须通过BigInteger的实例对象调用,不可直接用类名BigInteger做静态调用,你代码里的BigInteger.modInverse(...)写法不符合方法调用规则- 另外
modInverse()方法需要传入模数作为参数,你要计算a模26的逆,需要把26对应的BigInteger作为参数传入方法,原代码也缺少这个参数 - 原代码的运算括号配对存在语法错误,会导致编译不通过
修复方法
把a转换为BigInteger实例后,用该实例调用modInverse方法,传入模数26对应的BigInteger对象,修正括号配对即可。另外可以提前把a的模逆算出来,不要放到内层循环重复计算,优化执行效率。
修正后代码
for(int a = 1; a<=25;a++) { // 提前计算a模26的逆,仅当a和26互质时不会抛出异常 int aInverse = BigInteger.valueOf(a).modInverse(BigInteger.valueOf(26)).intValue(); for(int b = 0; b<=26; b++) { for(int i =0; i < cipherText.length;i++) { cipherText[i] = (byte) ( (((cipherText[i]-'A') - b) * aInverse % 26) + 'A' ); } } }
注意事项
仿射密码要求密钥a必须和26互质,也就是a只能取1、3、5、7、9、11、15、17、19、21、23、25,当a取其他值时modInverse()会抛出ArithmeticException异常,你可以在循环里提前加判断过滤不符合要求的a值,避免程序崩溃。
内容的提问来源于stack exchange,提问作者user14370029
相关产品推荐
相关产品推荐

