Hi all, 來到第 11 天,今天就來講講該如何把昨天的公式實作吧。
首先這次會使用到的物件分為三種: HashHelper
, EccGenerator
, ChameleonHashHelper
HashHelper
這個物件是用來昨雜湊值計算使用,其中我們會透過 SHA256 的方式將輸入值雜湊化。
public abstract class HashHelper { public static BigInteger Sha256 (string message ) { var bmsg = Encoding.ASCII.GetBytes(message); var sha256Digest = new Sha256Digest(); sha256Digest.BlockUpdate(bmsg, 0 , bmsg.Length); var hash = new byte [sha256Digest.GetDigestSize()]; sha256Digest.DoFinal(hash, 0 ); return new BigInteger(hash); } }
EccGenerator
這個物件會被使用來建立 橢圓曲線加密演算法 所需要的參數,如: 曲線基點與金鑰對等,code 如下:
public static class EccGenerator { public static KeyPair GenerateKeyPair (int keySize ) { var gen = new ECKeyPairGenerator("ECDSA" ); gen.Init(new KeyGenerationParameters(new SecureRandom(), keySize)); var keyGen = gen.GenerateKeyPair(); var privateKey = (ECPrivateKeyParameters) keyGen.Private; var publicKey = (ECPublicKeyParameters) keyGen.Public; var generateKeyPair = new KeyPair() { PublicKey = publicKey.Q, PrivateKey = privateKey.D, BasePoint = publicKey.Parameters.G, KeySize = keySize }; return generateKeyPair; } }
ChameleonHashHelper
今天的主角,負責計算變色龍雜湊函數及計算訊息簽章的生成與驗證,code 如下:
public static class ChameleonHashHelper { public static BigInteger Sign (ChameleonHashRequest request ) { var msgHash = HashHelper.Sha256(request.Message); var dn = msgHash.Multiply(request.KeyPair.PrivateKey); return request.SessionKey.Add(dn).Mod(request.Order); } public static bool Verify (ChameleonHashRequest request, ECPoint rightChameleonHash ) { return GetChameleonHash(request).Equals(rightChameleonHash); } public static ECPoint GetChameleonHash (ChameleonHashRequest request ) { var msgHash = HashHelper.Sha256(request.Message); var rP = request.KeyPair.BasePoint.Multiply(request.Signature); var chameleonHash = request.KeyPair.PublicKey.Multiply(msgHash).Add(rP).Normalize(); return chameleonHash; } }
Conclusion
上述就是之後計算變色龍雜湊值所需要的Code, 至於該怎麼讓我們的專案做使用,我這邊打算使用 SDK 的方式導入。
在這邊提供:
好啦,今天就到這邊啦~~~
結語: 憂鬱星期二放鬆下哈