CryptoHelper.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Org.BouncyCastle.Crypto.Agreement.Srp;
  7. using Org.BouncyCastle.Crypto.Digests;
  8. using Org.BouncyCastle.Math;
  9. using Org.BouncyCastle.Security;
  10. namespace Helper
  11. {
  12. public class CryptoHelper
  13. {
  14. public static byte[] SRP6CalculateM1(
  15. BigInteger n, BigInteger g, BigInteger s, BigInteger b, string account, string password)
  16. {
  17. var random = new SecureRandom();
  18. var srp6Client = new Srp6Client();
  19. srp6Client.Init(n, g, new Sha1Digest(), random);
  20. BigInteger a = srp6Client.GenerateClientCredentials(
  21. s.ToByteArray(), account.ToByteArray(), password.ToByteArray());
  22. BigInteger clientS = srp6Client.CalculateSecret(b);
  23. // 计算M1
  24. var sha1Digest = new Sha1Digest();
  25. var kBytes = new byte[sha1Digest.GetDigestSize()];
  26. var clientSBytes = clientS.ToByteArray();
  27. sha1Digest.BlockUpdate(clientSBytes, 0, clientSBytes.Length);
  28. sha1Digest.DoFinal(kBytes, 0);
  29. sha1Digest.Reset();
  30. var m1 = new byte[sha1Digest.GetDigestSize()];
  31. var aBytes = a.ToByteArray();
  32. var bBytes = b.ToByteArray();
  33. sha1Digest.BlockUpdate(aBytes, 0, aBytes.Length);
  34. sha1Digest.BlockUpdate(bBytes, 0, bBytes.Length);
  35. sha1Digest.BlockUpdate(kBytes, 0, kBytes.Length);
  36. sha1Digest.DoFinal(m1, 0);
  37. return m1;
  38. }
  39. }
  40. }