Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
1,193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.70 KB | None | 0 0
  1. using SharpCore.Framework.DataExtensions;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Numerics;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Linq;
  8. using SharpCore.Framework.Converters;
  9.  
  10. namespace SharpCore.Framework.Cryptography.SRP6
  11. {
  12.     public class SRP6
  13.     {
  14.         private SHA1CryptoServiceProvider _sha1CSP = new SHA1CryptoServiceProvider();
  15.        
  16.         public BigInteger Modulus { get; private set; } = BigIntegerExtensions.CreateBigInteger("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7", 16); // N
  17.         public BigInteger Generator { get; private set; } = new BigInteger(7); // g
  18.         public BigInteger Salt { get; private set; } // s
  19.         public BigInteger Verifier { get; private set; } // v
  20.         public BigInteger ServerPublicEphemeral { get; private set; } // B
  21.         public BigInteger ServerPrivateEphemeral { get; private set; } // b
  22.         public BigInteger PrivateKey { get; private set; } // x
  23.         public BigInteger Multiplier { get; private set; } // k
  24.         public BigInteger Scrambler { get; private set; } // u
  25.         public BigInteger SessionKey { get; private set; } // S
  26.         public BigInteger ClientEvidence { get; private set; } // M1
  27.         public BigInteger ServerEvidence { get; private set; } // M2
  28.         public BigInteger ClientPublicEphemeral { get; private set; } // A
  29.         public byte[] IdentityHash { get; private set; }
  30.  
  31.         public SRP6() { }
  32.  
  33.         private void GenerateIdentityHash(string username, string password)
  34.         {
  35.             IdentityHash = SRP6Helpers.Hash((Encoding.UTF8.GetBytes((username + ":" + password).ToUpper())));
  36.         }
  37.  
  38.         public void Step1(string username = null, string password = null, string s = null, string v = null)
  39.         {
  40.             if (username != null && password != null)
  41.                 GenerateIdentityHash(username, password);
  42.  
  43.             // Generation de s = RAND()
  44.             if (s == null)
  45.                 Salt = BigIntegerExtensions.CreateBigInteger(256, new Random());
  46.             else
  47.                 Salt = BigIntegerExtensions.CreateBigInteger(s, 16);
  48.  
  49.             if (v == null)
  50.             {
  51.                 // Generation de x = H(s | H(P))
  52.                 PrivateKey = SRP6Helpers.Hash(Salt.ToCleanByteArray().Combine(IdentityHash)).ToBigInteger();
  53.                 // Generation de v = g ^ x % N
  54.                 Verifier = Generator.ModPow(PrivateKey, Modulus);
  55.             }
  56.             else
  57.                 Verifier = BigIntegerExtensions.CreateBigInteger(v, 16);
  58.  
  59.             // Generation de k = 3
  60.             Multiplier = new BigInteger(3);
  61.             // Generation de b = RAND()
  62.             ServerPrivateEphemeral = BigIntegerExtensions.GeneratePseudoPrime(128, 100, new Random());
  63.             // Generation de B = kv + g^b
  64.             ServerPublicEphemeral = Multiplier.Multiply(Verifier).Add(Generator.ModPow(ServerPrivateEphemeral, Modulus));
  65.         }
  66.  
  67.         public void Step2(byte[] A, byte[] M1, string I)
  68.         {
  69.             // Generation de u = H(A | B)
  70.             _sha1CSP.Initialize();
  71.             byte[] u = _sha1CSP.ComputeHash(ByteExtensions.Combine(A, ServerPublicEphemeral.ToCleanByteArray()).ToArray(), 0, 32);
  72.             Scrambler = new BigInteger(u.Concat(new byte[] { 0 }).ToArray());
  73.  
  74.             // Generation de S = (A * v^u) ^ b % N
  75.  
  76.  
  77.             //// Generation de K = H(S))
  78.             //_sha1CSP.Initialize();
  79.  
  80.             // Generation de M1
  81.             //Client -> Serveur : M = H(H(N) xor H(g), H(I), s, A, B, K)  (xor correspond au OU exclusif)
  82.             //Serveur->Client : H(A, M, K)
  83.  
  84.             // Generation de M2 = H(A | M1 | K)
  85.         }
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement