SRP6Helper.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System.Linq;
  2. using System.Security.Cryptography;
  3. namespace Helper
  4. {
  5. public static class SRP6Helper
  6. {
  7. public static byte[] SRP6ClientCalcK(HashAlgorithm hashAlgorithm, byte[] clientS)
  8. {
  9. int clientSLength = clientS.Length;
  10. int halfLength = clientSLength / 2;
  11. var kBytes = new byte[40];
  12. var halfS = new byte[clientSLength];
  13. for (int i = 0; i < halfLength; ++i)
  14. {
  15. halfS[i] = clientS[i * 2];
  16. }
  17. var p1 = hashAlgorithm.ComputeHash(halfS);
  18. for (int i = 0; i < 20; ++i)
  19. {
  20. kBytes[i * 2] = p1[i];
  21. }
  22. for (int i = 0; i < halfLength; ++i)
  23. {
  24. halfS[i] = clientS[i * 2 + 1];
  25. }
  26. var p2 = hashAlgorithm.ComputeHash(halfS);
  27. for (int i = 0; i < 20; ++i)
  28. {
  29. kBytes[i * 2 + 1] = p2[i];
  30. }
  31. return kBytes;
  32. }
  33. public static byte[] SRP6ClientM1(
  34. HashAlgorithm hashAlgorithm, byte[] identitySalt,
  35. byte[] n, byte[] g, byte[] s, byte[] a,
  36. byte[] b, byte[] k)
  37. {
  38. var hashN = hashAlgorithm.ComputeHash(n);
  39. var hashG = hashAlgorithm.ComputeHash(g);
  40. for (var i = 0; i < hashN.Length; ++i)
  41. {
  42. hashN[i] ^= hashG[i];
  43. }
  44. var hashGXorhashN = hashN; // H(N) ^ H(g)
  45. var hashedIdentitySalt = hashAlgorithm.ComputeHash(identitySalt); // H(I)
  46. // H(H(N) ^ H(g), H(I), s, A, B, K_c)
  47. var m = hashAlgorithm.ComputeHash(new byte[0]
  48. .Concat(hashGXorhashN)
  49. .Concat(hashedIdentitySalt)
  50. .Concat(s)
  51. .Concat(a)
  52. .Concat(b)
  53. .Concat(k)
  54. .ToArray());
  55. return m;
  56. }
  57. }
  58. }