示例#1
0
文件: PgpKey.cs 项目: 1hub/springburg
        private protected PgpKey(KeyPacket keyPacket)
        {
            this.keyPacket         = keyPacket;
            this.keyCertifications = new List <PgpCertification>();
            this.ids = new List <PgpUser>();

            this.fingerprint = CalculateFingerprint();

            if (keyPacket.Version <= 3)
            {
                var rsaParameters = RsaKey.ReadOpenPgpPublicKey(keyPacket.KeyBytes, out var _);
                var modulus       = rsaParameters.Modulus !;

                this.keyId = (long)(((ulong)modulus[modulus.Length - 8] << 56)
                                    | ((ulong)modulus[modulus.Length - 7] << 48)
                                    | ((ulong)modulus[modulus.Length - 6] << 40)
                                    | ((ulong)modulus[modulus.Length - 5] << 32)
                                    | ((ulong)modulus[modulus.Length - 4] << 24)
                                    | ((ulong)modulus[modulus.Length - 3] << 16)
                                    | ((ulong)modulus[modulus.Length - 2] << 8)
                                    | (ulong)modulus[modulus.Length - 1]);
            }
            else
            {
                this.keyId = (long)(((ulong)fingerprint[fingerprint.Length - 8] << 56)
                                    | ((ulong)fingerprint[fingerprint.Length - 7] << 48)
                                    | ((ulong)fingerprint[fingerprint.Length - 6] << 40)
                                    | ((ulong)fingerprint[fingerprint.Length - 5] << 32)
                                    | ((ulong)fingerprint[fingerprint.Length - 4] << 24)
                                    | ((ulong)fingerprint[fingerprint.Length - 3] << 16)
                                    | ((ulong)fingerprint[fingerprint.Length - 2] << 8)
                                    | (ulong)fingerprint[fingerprint.Length - 1]);
            }
        }
示例#2
0
文件: PgpKey.cs 项目: 1hub/springburg
        private byte[] CalculateFingerprint()
        {
            HashAlgorithm digest;

            if (Version <= 3)
            {
                var rsaParameters = RsaKey.ReadOpenPgpPublicKey(keyPacket.KeyBytes, out var _);
                digest = MD5.Create();
                digest.TransformBlock(rsaParameters.Modulus !, 0, rsaParameters.Modulus !.Length, null, 0);
                digest.TransformBlock(rsaParameters.Exponent !, 0, rsaParameters.Exponent !.Length, null, 0);
            }
            else
            {
                byte[] kBytes = keyPacket.GetEncodedContents();
                digest = SHA1.Create();
                digest.TransformBlock(new byte[] { 0x99, (byte)(kBytes.Length >> 8), (byte)kBytes.Length }, 0, 3, null, 0);
                digest.TransformBlock(kBytes, 0, kBytes.Length, null, 0);
            }

            digest.TransformFinalBlock(Array.Empty <byte>(), 0, 0);

            return(digest.Hash !);
        }