如何使用java为tor onion服务生成有效的私有(RSA 1024)密钥?

如何使用java为tor onion服务生成有效的私有(RSA 1024)密钥?,java,rsa,tor,Java,Rsa,Tor,我正在尝试为java中的tor onion服务生成有效的私钥。使用此私钥,我希望获得有效的.onion地址 我已经运行了下面代码的各种组合(有这个位/没有那个位) KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(1024); KeyPair keyPair = keyPairGenerator.generateKeyPair(); Privat

我正在尝试为java中的tor onion服务生成有效的私钥。使用此私钥,我希望获得有效的.onion地址

我已经运行了下面代码的各种组合(有这个位/没有那个位)

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKeyGenerated = keyPair.getPrivate();

KeyFactory keyFactory =  KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyGenerated.getEncoded()));

Base64.Encoder encoder = Base64.getEncoder();
String privateKeyEncoded = encoder.encodeToString(privateKey.getEncoded());

String fileName = "{{where I'm wanting to store the file}}";    
Writer writer = new FileWriter(fileName);
writer.write("-----BEGIN RSA PRIVATE KEY-----\n");
writer.write(privateKeyEncoded);
writer.write("\n-----END RSA PRIVATE KEY-----\n");
writer.close();
生成后,我将密钥复制到my/var/lib/tor/hidden\u service/private\u key,删除所有关联的主机名并启动tor服务。在日志中,我得到了错误:

TLS error: wrong tag (in asn1 encoding routines:ASN1_CHECK_TLEN:---)
TLS error: nested asn1 error (in asn1 encoding routines:ANS1_D2I_EX_PRIMITIVE:---) 
TLS error: nested asn1 error (in asn1 endoding routines:ASN1_TEMPLATE_NOEXP_D2I:---) 
TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)
如果生成了结果.onion地址,则该地址将不起作用


如何生成有效的私钥?

解决方案:使用
开始私钥更改
开始RSA私钥

Java以PKCS#8格式对密钥进行编码

但是您正在生成一个PEM文件,其头为
---BEGIN RSA PRIVATE KEY---
,该文件保留给PKCS#1密钥(旧格式但非常常见),并且.onion假设它是pkcs1,而实际上是pkcs8。看到错误了吗

TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)
因此,您需要使用PCKS#8头
----开始私钥------


另请参见本帖

尝试用
开始私钥
更改
开始RSA私钥
。最后一个问题是,我不好意思承认这是有效的。谢谢别担心,这不是一个小问题。现在我要解释一下,酷,如果你发布一个答案,我可以接受你的解决方案。仅供参考:你不需要编码,通过工厂运行它,然后再次编码;后两个步骤是不可操作的。此外,PEM规范要求base64数据分成不超过64个字符的行,尽管MIME将其更改为76,我知道的大多数软件都接受这一点,并且
java.util.base64.getMimeEncoder
创建了它。Tor显然接受一条庞大的线路,但其他sw可能不接受。
TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)