Cryptography 如何根据私钥验证.洋葱域

Cryptography 如何根据私钥验证.洋葱域,cryptography,rsa,private-key,deep-web,Cryptography,Rsa,Private Key,Deep Web,我正在做一个项目,将基本上出售。洋葱(TOR)域名。 生成域的过程类似于挖掘比特币——RSA私钥是批量生成的,如果一个私钥与我的单词列表中的某个内容随机匹配,那么它就会保存在某个地方并添加到数据库中 这里的问题是,这仍然是一个缓慢的过程来做独奏-所以为了让我尝试,使其成为一个协作练习-我想创建一个在线API/Rest API,将允许人们上传他们的域和私钥,让他们在网站上出售 问题是-我不太知道如何根据私钥验证他们的域名 例如: 他们将提供一个类似于 洋葱 关键是: ----开始RSA私钥----

我正在做一个项目,将基本上出售。洋葱(TOR)域名。 生成域的过程类似于挖掘比特币——RSA私钥是批量生成的,如果一个私钥与我的单词列表中的某个内容随机匹配,那么它就会保存在某个地方并添加到数据库中

这里的问题是,这仍然是一个缓慢的过程来做独奏-所以为了让我尝试,使其成为一个协作练习-我想创建一个在线API/Rest API,将允许人们上传他们的域和私钥,让他们在网站上出售

问题是-我不太知道如何根据私钥验证他们的域名

例如: 他们将提供一个类似于

洋葱

关键是:
----开始RSA私钥-----
MIICXQIBAAKBgQCb+wlPxR8VoUJsYcEFsPX+LfB3jorW9QlH1N38itQvMs0RyTCB
+c7hfYQH2f8Z67lobWvveYct51ykhB8n3AluMYIF3OxGlmQJuMIFQmKFryLexzPj
LEPREB7+KMEL9SX1SL4A2Z0QJL4501IJ0T5C3C演示
AQKBgBwWDEMOYKaSO17xJRuf32CDYJcDKtkJ1GlWROHxREo68J+74DqF55rnoYl/
4OKFJUMA2 WJJASVRMVIBD79VNI3EB9MFNZDEMOYA6EIYO1VDEMOZENRSZKPGEJ
vOCHbDiG/FLZSCKSADEMOEAUEAUQ3W8669DU4FRO9/al+1Udhakeay+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
-----结束RSA私钥------

有没有人能告诉我一些可以使用私钥的.Net代码的方向,并验证提供的域是否真实?
这个github项目(我使用的工具之一——有代码“生成”域和私钥——我只是不确定事后如何执行验证)

对此没有答案,但我确实找到了一种方法,在源代码中使用大葱来根据洋葱地址验证私钥

RSAWrapper rsaWrapper = new RSAWrapper("d:\\pk.txt");
Console.WriteLine(rsaWrapper.OnionHash);
不理想-因为它需要私钥。 在rsawapper内部-它执行一些不安全的代码来对公钥执行“某些操作”,以确定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;
            }
        }
编辑-低音: 看起来rsawapper类非常内聚且模块化。 我能够复制它-它只需要访问OpenSSL库,而且它还有一个RSA.FromPublicKey(字符串s);用于创建RSA的方法

所以现在,我能够做到

    RSAWrapper rsaWrapper = new RSAWrapper("d:\\pubkey.txt", true);
    Console.WriteLine(rsaWrapper.OnionHash);
花了几个月的时间,但得到了一个比我预想的更好的答案。
现在我可以获取公钥,并验证洋葱地址是否与公钥匹配。这将验证洋葱地址的所有权,而无需通过网络发送私钥的风险。

如果其他人也知道私钥,私钥的价值是什么?私钥验证.洋葱域的所有权-除非其他人拥有完全相同的私钥,否则无法进行模拟。因此,.Onion域名和私钥之间存在关系。访问你的.洋葱域的人不知道你的私钥,只知道你的公共.洋葱域地址。你为什么需要他们的私钥?他们可以用私钥对文本进行签名。然后,您可以根据他们的公钥验证他们是否拥有该私钥。但在你的问题中,你似乎需要他们发送他们的私钥。我实际上并不关心如何进行验证——我所需要的只是一些工作代码,可以验证他们提供的域是否具有有效的私钥。另外,如果他们想从我正在制作的网站上分发域名,私钥必须在某个时候保存在数据库中,以便通过电子邮件发送给购买它的人。理想情况下-我希望有一个基本上可以做到这一点的方法:bool IsValid(stringdomain,stringprivatekey),我只想知道提供的私钥是否与域匹配。如果可以提供其他内容来代替私钥,则要安全地执行此操作,您需要拆分私钥,其中一部分仅为想要拥有域的人所知,而矿工仅更改某些部分,例如公共指数或第三个素数。