我需要在字符串和组中的 GT( e(g,g)^n ) 类型元素之间进行相乘。我首先将字符串转换为元素,然后当我想要解密消息时遇到问题。
这是简单版本的代码:
TypeACurveGenerator pg = new TypeACurveGenerator(160,512);
//generate the parameters of the elliptic curve
PairingParameters typeAParams = pg.generate();
//initialize the pairing
PairingFactory.getInstance().setUsePBCWhenPossible(true);
Pairing p= PairingFactory.getPairing(typeAParams);
String s="hahaha test";
Element g = p.getGT().newElementFromBytes(Base64.encodeBytes(s.getBytes()).getBytes());
byte[] s3 = Base64.decode(g.toString());
System.out.println(s);
System.out.println(g);
System.out.println(s3);
然后编译显示:
Bad Base64 input character decimal 123 in array position 0 (error line: byte[] s3 = Base64.decode(g.toString()); )
我对这个结果感到困惑,并且没有能力解决它。
然后我尝试了另一种方法,但解码后总是不同(与原始字符串比较)
这是我的代码的简单版本:
TypeACurveGenerator pg = new TypeACurveGenerator(160,512);
//generate the parameters of the elliptic curve
PairingParameters typeAParams = pg.generate();
//initialize the pairing
PairingFactory.getInstance().setUsePBCWhenPossible(true);
Pairing p= PairingFactory.getPairing(typeAParams);
String s="hahaha test";
Element g = p.getGT().newElementFromBytes(Base64.decode(s));
String s3 = Base64.encodeBytes(g.toBytes());
System.out.println(s);
System.out.println(g);
System.out.println(s3);
和编译显示
hahaha test
{x=146958119709534,y=0}
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFqFqFq14AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
我不知道为什么原始字符串和解码后的字符串不同...
谁能知道问题所在或给我一些建议吗?
最佳答案
您可能会混淆您似乎尝试使用的加密原语的 Base64 编码方法。在第一个代码示例中,您尝试对 Element.toString 生成的字符串进行 Base64 解码,在第二个代码示例中,您尝试对测试字符串进行 Base64 解码。这两个字符串一开始都不是经过 Base64 编码的,因此这很可能会失败。
如果您尝试加密数据,我认为您应该寻找比您正在使用的 API 高级得多的 API。低级加密原语非常容易以不安全的方式使用,即使您确实获得了有效的解密并且它似乎可以工作。
关于java - 如何使用 JPBC 解密字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47982052/