Example #1
0
        /// <summary>
        /// ユーザ鍵を生成します。
        /// </summary>
        /// <returns></returns>
        public static PeerKey GeneratePeerKey()
        {
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(PeerKeyBit);

            PeerKey key = new PeerKey();

            key.RSAParam     = rsaProvider.ExportParameters(true);
            key.Expire       = DateTime.Now.AddHours(PeerKeyExpireHours); // TODO: HACK: PC時計に依存する
            key.KeySignature = SignPeerKey(key);

            return(key);
        }
Example #2
0
        /// <summary>
        /// ユーザ鍵の署名を生成します。
        /// 引数のユーザ鍵インスタンスは書き換えません。
        /// </summary>
        /// <param name="key"></param>
        /// <returns>署名</returns>
        private static string SignPeerKey(PeerKey key)
        {
            // 署名用データ生成
            byte[] expire    = Encoding.ASCII.GetBytes(key.Expire.ToString("yyyy/MM/dd HH-mm-ss"));
            byte[] publicKey = key.PublicKeyBytes;
            byte[] signData  = Enumerable.Concat(publicKey, expire).ToArray();

            SHA1CryptoServiceProvider sha1Provider = new SHA1CryptoServiceProvider();

            byte[] sha1SignData = sha1Provider.ComputeHash(signData);

            // 署名生成
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();

            rsaProvider.ImportParameters(KeyDefine.PeerVerificationKey);

            RSAPKCS1SignatureFormatter pkcsFormatter = new RSAPKCS1SignatureFormatter(rsaProvider);

            pkcsFormatter.SetHashAlgorithm("SHA1");

            byte[] sign = pkcsFormatter.CreateSignature(sha1SignData);

            return(Convert.ToBase64String(sign, Base64FormattingOptions.None));
        }