如何从Java中的公钥生成Tor服务洋葱地址?

用户名

我正在尝试生成从公共密钥生成的洋葱地址。

如果将下一行添加到上一个帖子中的代码中,则在privateKeyEncoded之后

String publicKeyEncoded = encoder.encodeToString(publicKey.getEncoded());

当我将privateKeyEncoded放入/ var / lib / tor / hidden_​​service / private_key时,保存publicKeyEncoded并启动tor服务,将创建一个新的洋葱地址。我试图从tor服务和从publicKeyEncoded创建的服务中获取相同的洋葱地址使用此代码

import org.apache.commons.codec.binary.Base32;
import org.apache.commons.codec.binary.Base64;

//base64 string from the public key created
String publicKeyTest = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMnFkJTMZ2ZxnqLwCiB/EWHjsHbnC+sKEIrGbyOTYiTl3LygsekAX6LhgcllscLUFqSKlMRB3jRB0GAPrIc73E/hTnmWBtF8NT8DhZzl06LZ1BtNjfON1pHm87STMAayiSaXPmSOwIqOA89aJPcA9m4v4IhtjYSFXmCAsE4RqoAwIDAQAB";
//the onion address the tor service gives when the private key is used
String onionAddressTest = "qqkhrc4men3fiqyl";

byte[] publicKeyDecoded = Base64.decodeBase64(publicKeyTest);
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = messageDigest.digest(publicKeyDecoded);
int numberOfCharacters = 10;
byte[] reducedHash = new byte[numberOfCharacters];
for(int i = 0; i < numberOfCharacters; i++) {
    reducedHash[i] = sha1hash[i];
}
Base32 base32encoder = new Base32();
String onionAddress = base32encoder.encodeAsString(reducedHash).toLowerCase();
System.out.println(onionAddress);  // but this gives "7j3iz4of464hje2e"

我尝试使用海绵宝宝复制我的转化,但得到相同的答案。这使我认为生成公钥的方式有问题,或者从base64进行的初始转换中有问题。

给定公钥(publicKeyTest),如何使用Java获取洋葱地址(onionAddressTest)?

dave_thompson_085

根据这个这个,你需要哈希只有部分在偏移22开始的X.509 SubjectPublicKeyInfo进行编码由Java使用其称之为“X.509”和OpenSSL的这称之为“PUBKEY”。我在此上找不到任何实际的Tor文档,但是我不认为这恰好是RSA-1024密钥的SPKI格式的算法相关数据的开始:

$ openssl asn1parse -i <49833260.b64
    0:d=0  hl=3 l= 159 cons: SEQUENCE
    3:d=1  hl=2 l=  13 cons:  SEQUENCE
    5:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
   16:d=2  hl=2 l=   0 prim:   NULL
   18:d=1  hl=3 l= 141 prim:  BIT STRING
# 18 +3 for DER tag+len +1 for unusedbitcount in BITSTRING = 22
# and the content beginning at 22 is:
$ openssl asn1parse -i -strparse 22 <49833260.b64
    0:d=0  hl=3 l= 137 cons: SEQUENCE
    3:d=1  hl=3 l= 129 prim:  INTEGER           :8C9C59094CC6766719EA2F00A207F11
61E3B076E70BEB0A108AC66F23936224E5DCBCA0B1E9005FA2E181C965B1C2D416A48A94C441DE34
41D0600FAC873BDC4FE14E799606D17C353F03859CE5D3A2D9D41B4D8DF38DD691E6F3B4933006B2
8926973E648EC08A8E03CF5A24F700F66E2FE0886D8D84855E6080B04E11AA803
  135:d=1  hl=2 l=   3 prim:  INTEGER           :010001
# which is (exactly) the RSAPublicKey structure from PKCS1

因此,要在Java中执行此操作,您可以仅假设使用RSA-1024,或者使用BouncyCastle(并且我也假设但尚未经过测试,还包括海绵堡),您实际上可以正确地解析ASN.1:

byte[] pubkeyder = Base64.decode("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMnFkJTMZ2ZxnqLwCiB/EWHjsHbnC+sKEIrGbyOTYiTl3LygsekAX6LhgcllscLUFqSKlMRB3jRB0GAPrIc73E/hTnmWBtF8NT8DhZzl06LZ1BtNjfON1pHm87STMAayiSaXPmSOwIqOA89aJPcA9m4v4IhtjYSFXmCAsE4RqoAwIDAQAB");
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
// method 1
byte[] x1 = sha1.digest (Arrays.copyOfRange(pubkeyder, 22, pubkeyder.length));
System.out.println (new String(b32enc(Arrays.copyOf(x1,10))).toLowerCase());
// method 2
byte[] x2 = sha1.digest (SubjectPublicKeyInfo.getInstance(pubkeyder).getPublicKeyData().getOctets());
System.out.println (new String(b32enc(Arrays.copyOf(x2,10))).toLowerCase());
-> 
qqkhrc4men3fiqyl
qqkhrc4men3fiqyl

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

在Java中以十六进制生成公钥和私钥

来自分类Java

用Java生成的RSA公钥在php中无效

来自分类Dev

如何从节点js中的RSA公钥生成SKI?

来自分类Java

如何从Java中的Apple公钥JSON响应中获取公钥?

来自分类Dev

如何从私钥生成RSA公钥?

来自分类Dev

如何从其私钥生成ECDSA公钥?

来自分类Dev

如何从Java中的PGP公钥获取用户ID?

来自分类Java

如何在Java中读取rsa公钥文件?

来自分类Java

如何从Java中的SSH RSA公钥计算指纹?

来自分类Dev

如何在Android密钥库中存储和检索从服务器端应用程序生成的RSA公钥?

来自分类Java

如何读取rsa公钥形式的字符串(由java生成,我想用Python读取)

来自分类Dev

如何在RSAParameters中设置公钥

来自分类Java

解析装甲ECC公钥/私钥(从GPG CLI生成)在Java中

来自分类Java

从原生Java中的字节数组私钥生成EC公钥(7+)

来自分类Dev

Java中RSA公钥生成和加密的有效实现

来自分类Dev

如何从nodejs中身份服务器4的jwk返回中提取公钥?

来自分类Java

如何生成公钥的专用密钥在X25519?

来自分类Dev

Flutter-如何生成私钥/公钥对以加密消息

来自分类Dev

如何使pip安装接受服务器的公钥?

来自分类Dev

服务器如何验证JWT?公钥来自哪里?

来自分类Java

无法在Java中获得公钥显示以匹配Adobe中的公钥显示

来自分类Dev

生成RSA公钥/私钥对

来自分类Dev

RSA公钥生成-Swift

来自分类Dev

在Java中生成公钥和私钥会生成所有私钥和公钥的相似开始

来自分类Dev

Hyperledger Fabric EVM如何从公钥生成地址?

来自分类Dev

如何还原rsa公钥?或将字节更改为python中的rsa公钥?

来自分类Java

如何使用Modulus和指数/公钥快速破解Java中的大量RSA加密

来自分类Dev

如果公钥的算法是EC,如何在Java中验证签名?

来自分类Java

如何在Java中结合私钥和公钥来共享秘密

TOP 榜单

热门标签

归档