加密/令牌认证指南

时间:2018-09-20 18:23:11

标签: c# encryption

我已经购买了一些共享有关如何验证here的文档的硬件:

绝对不是我想要的加密货币,我正在尝试弄清楚如何甚至找到哪种形式的加密货币来尝试查找在线示例,以便我可以尝试使用c#和更佳的.net内核进行通信,以便成为x-平台

现在有代码here可以做到这一点,但我相信它位于node.js中,但我不知道crypto lib

总之,这就是文档中的内容:

  
      
  1. 通过“ jdev / sys / getPublicKey”-> {publicKey}获取Miniservers的公钥。在客户端上存储b。格式:X.509编码键   ANS.1
  2.   
  3. 打开WebSocket连接a。使用以下路径:``ws:// {ipOrUrl}:{port} / ws / rfc6455''。b。指定“远程控制”为   安全WebSocket协议。 C。小型服务器不支持wss://。
  4.   
  5. 生成AES256密钥-> {key}(十六进制)
  6.   
  7. 生成随机AES iv(16字节)-> {iv}(十六进制)
  8.   
  9. RSA使用{publicKey}-> {session-key}(Base64)加密AES密钥+ iv “ {key}:{iv}”是需要加密的有效负载   使用RSA
  10.   
  11. 通过“ jdev / sys / keyexchange / {session-key}”交换密钥
  12.   
  13. 生成随机的盐,十六进制字符串(长度可能会有所不同,例如2个字节)-> {盐}
  14.   
  15. 现在有两个选项:如果存在令牌,则按照使用令牌进行身份验证中所述进行身份验证b。如果需要令牌   已获取,请按照获取令牌配置9.3中的描述进行操作   与小型服务器进行通信第5页,共21页
  16.   
  17. 基于令牌的身份验证成功或获取新令牌后,套接字将通过身份验证并可以使用。
  18.   

因此,我很确定我对第二步很满意(也许不格式化x.509编码的密钥。我已经把它当作填充的剥离,只是获得了base64值:

        UriBuilder builder = new UriBuilder("http://192.168.0.77");
        using (var request = new LxHttpRequest(builder.Uri))
        {
            CancellationToken token = new CancellationToken();
            string result = request.GetStringAsync("jdev/sys/getPublicKey", token).Result;
            var res = ResultConverter.Deserialize(result);

            Console.WriteLine(TokenAuth.parsePublicKey(res.Content));
        }

第3步,我从loxnet克隆了代码,我认为这是一个很好的起点,对此感到满意。

步骤4/5是我所在的位置

         var aes = new AesCryptoServiceProvider();
            aes.GenerateIV();
            byte[] iv = aes.IV;
            aes.GenerateKey();
            Console.WriteLine("Key base64: {0}", Convert.ToBase64String(aes.Key));

但是大约在这一点上我的头被腌了,我很生气。我很高兴这感觉就像是在寻求作业方面的帮助-但我更希望有人可以解释这叫什么,以便我继续进行搜索-除非有人可以帮忙提供示例/代码片段,或者是建议做一些辛苦工作的nuget软件包-我看过bouncycastle,但这使我的眼睛不愿尝试理解任何东西:D:D

请放心燃烧!

1 个答案:

答案 0 :(得分:1)

所以我又看了一下说明,并尝试按照说明进行操作。这看起来像我在正确的轨道上吗?

    private static void CryptoTest()
    {
        byte[] serversPublicKey = GetPublicKey();

        // Create a new instance of RSACryptoServiceProvider.
        var RSA = new RSACryptoServiceProvider();
        var RSAKeyInfo = RSA.ExportParameters(includePrivateParameters: false);

        // Set RSAKeyInfo withthe provided public key. 
        RSAKeyInfo.Modulus = serversPublicKey;
        RSA.ImportParameters(RSAKeyInfo);

        // Generate New AES key
        var aes = new AesCryptoServiceProvider();
        aes.GenerateIV();
        aes.GenerateKey();

        byte[] sessionKey;

        using (var stream = new MemoryStream())
        {
            using (var writer = new BinaryWriter(stream))
            {
                // Encrypt the aes key and iv
                writer.Write(aes.Key);
                writer.Write(":");
                writer.Write(aes.IV);
            }

            sessionKey = RSA.Encrypt(stream.ToArray(), RSAEncryptionPadding.Pkcs1);
        }

        Console.WriteLine($"Encrypted Session Key (Base64): {Convert.ToBase64String(sessionKey)}");

        // Todo Step 7 send key to server

    }