我正在做一个项目,基本上将出售.Onion (TOR)域名。生成域的过程类似于挖掘比特币--大量生成RSA私钥,如果其中一个随机匹配我的单词列表中的某个内容--那么它就会被保存到某个地方并添加到数据库中。
这里的问题是,这仍然是一个缓慢的过程,单独完成--为了让我尝试让它成为一个协作练习--我想创建一个在线API / Rest,允许人们上传他们的域名和私钥,让他们在网站上销售。
问题是-我不太知道如何用私钥来验证他们的域名。
他们会提供一个类似于
abcdabcdabcdabcd.onion
关键是:-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCb+wlPxR8VoUJsYcEFsPX+LfB3jorW9QlH1N38itQvMs0RyTCB +c7hfYQH2f8Z67lobWvveYct51ykhB8n3AluMYIF3OxGlmQJuMIFQmKFryLexzPj LEPREB7+KmeL9Sx1sL4a2Z0qJL4501Ij0T5C3cDEMOvUQBpBttpuUbj1RQIEZTIY AQKBgBwWDEMOYKaSO17xJRuf32CDYJcDKtkJ1GlWROHxREo68J+74DqF55rnoYl/ 4OkfjUMA2WjjjASVRmviBD79vni3eB9MFNzDEMOYa6EIyo1vDEMOzEnfrszkPGEj vOCHbDiG/FlZsCKsADEMOEAuAUQ3W8669Du4FrO9/al+1IudhAkEAy+KBk8HFsO8Z UttdlsLt8//l+NbEMmWF/I588EGyYWUuPUVJd5Xv6iSaDMdecjeW/xf4Wja5C91n lCfb/lxhsQJBAMPZ2fzcUpyKhk6JretSyoq0iVQCO5Pn/0QwTwRUbKreXnnVBYY+ uco2ocfRwsmVK4LUwPgict5qw10bZfl8vdUCQATUV/S0zNc+DEMOw/7p5oJk5hwa +Hrhcf5aVw1AOqySGs0e9V+qDYIjrbkg/BDEMOD00bTTV9a9h3poFrm+DEMOQF2t lgqYbgDEMOZbE+PgebFB6swKfx9Px7+PnNsBK+Mld6pRyldfQ2DEMOr/cy4JQDYA oyX51SNWUMJzkYgeMEUCQQC8i6b3e06B9+++NGADEMO9F5KhlDr1wwSQqnNccDX5 N5vnlhJ/0DGxIMm/bP1ZPUK4/bmvKjNYd7D8zuz2cPor -----END RSA PRIVATE KEY-----
有人能告诉我一些.Net代码的方向,这些代码可以获取私钥,并验证提供的域也是真实的吗?https://github.com/lachesis/scallion这个github项目(我使用的工具之一--有代码“生成”域和私钥--我只是不知道如何在事后执行验证)。
发布于 2016-06-15 13:30:55
没有得到答案,但我确实找到了一种方法,使用葱的源代码,以验证私钥与洋葱的地址。
RSAWrapper rsaWrapper = new RSAWrapper("d:\\pk.txt");
Console.WriteLine(rsaWrapper.OnionHash);不理想-因为它需要私钥。在RSAWrapper内部-它执行一些不安全的代码来对公钥进行“某些操作”来确定一个DER编码的值。这是获取洋葱地址的重要部分。
public string OnionHash
{
get {
return tobase32str(this.get_der_hash(),10);
}
}
private byte[] get_der_hash()
{
var sha1 = new System.Security.Cryptography.SHA1Managed();
return sha1.ComputeHash(this.DER);
//return tobase32str(hash);
}
public byte[] DER {
get {
byte[] der;
int buf_size = Rsa.Size + 100;
int size = 0;
unsafe // must be a better way to do this!
{
IntPtr hglob = Marshal.AllocHGlobal(buf_size);
void* ptr = hglob.ToPointer();
void** ptr2 = &ptr;
size = Native.i2d_RSAPublicKey(Rsa.Handle, (byte**)ptr2);
if(size > buf_size)
throw new IndexOutOfRangeException("DER was too large!");
der = new byte[size];
Marshal.Copy(hglob,der,0,size);
Marshal.FreeHGlobal(hglob);
}
return der;
}
}Edit :看起来RSAWrapper类具有很强的凝聚力和模块化。我能够把它复制出来--它只需要访问OpenSSL库,它还有一个RSA.FromPublicKey(string s);方法来创建RSA。
所以现在,我可以
RSAWrapper rsaWrapper = new RSAWrapper("d:\\pubkey.txt", true);
Console.WriteLine(rsaWrapper.OnionHash);花了几个月的时间--但得到了一个比我想得到的更好的答案。现在我可以获取公钥,并验证洋葱地址是否与公钥匹配。这将验证洋葱地址的所有权,而无需通过网络发送私钥。
https://stackoverflow.com/questions/30831905
复制相似问题