コード例 #1
0
        /// <summary>
        /// Encryptes the session key stored in the SessionKey property
        /// and saves the results in the EncryptedSessionKey property.
        /// </summary>
        /// <remarks>This method also calles EncodeSessionKey so that it
        /// does not have been called before calling EncryptSessionKey.
        /// <p></p>
        /// Please note: calling this function takes some time, because
        /// asymmetrical encryption takes some time!
        /// </remarks>
        /// <param name="pkpPacket">An PublicKeyPacket to which
        /// the sessionkey should be encrypted to.</param>
        public void EncryptSessionKey(PublicKeyPacket pkpPacket)
        {
            EncodeSessionKey(pkpPacket.KeyMaterial[0].bitCount());

            AsymmetricCipher acCipher = new RSA();
            switch (aaPublicAlgorithm) {
                case AsymAlgorithms.ElGama_Encrypt_Sign:
                case AsymAlgorithms.ElGamal_Encrypt_Only:
                    acCipher = new ElGamal();
                    break;

                case AsymAlgorithms.RSA_Encrypt_Only:
                case AsymAlgorithms.RSA_Encrypt_Sign:
                    acCipher = new RSA();
                    break;

                default:
                    throw new System.Exception("The chosen public key algorithm is not yet implemented!");
            }

            this.bIsUpdated = true;
            biEncryptedSessionKey = acCipher.Encrypt(new BigInteger(this.bEncodedSessionKey), pkpPacket);
        }
コード例 #2
0
 private BigInteger[][] GenerateElGamalEncryptionKey(int iKeySize)
 {
     ElGamal egKeyGenerator = new ElGamal();
     BigInteger[][] biEncryptionKey = egKeyGenerator.Generate(iKeySize);
     return biEncryptionKey;
 }
コード例 #3
0
        /// <summary>
        /// Decrypts the session key stored in the EncryptedSessionKey
        /// property and saves the decrypted key in the EncodedSessionKey
        /// property.
        /// </summary>
        /// <remarks>This function also calls DecodeSessionKey so that the
        /// decrypted and decoded sessionkey is stored in the
        /// SessionKey property.</remarks>
        /// <param name="tskKey">A transportable secret key that is used to
        /// decrypt the encrypted session key.</param>
        /// <param name="strPassphrase">The passphrase used to decrypt the
        /// encrypted key material of the given transportable secret
        /// key.</param>
        public void DecryptSessionKey(TransportableSecretKey tskKey, string strPassphrase)
        {
            AsymmetricCipher acCipher = new RSA();
            switch (aaPublicAlgorithm) {
                case AsymAlgorithms.ElGama_Encrypt_Sign:
                case AsymAlgorithms.ElGamal_Encrypt_Only:
                    acCipher = new ElGamal();
                    break;

                case AsymAlgorithms.RSA_Encrypt_Only:
                case AsymAlgorithms.RSA_Encrypt_Sign:
                    acCipher = new RSA();
                    break;

                default:
                    throw new System.Exception("The chosen public key algorithm is not yet implemented!");
            }

            bool bFound = false;
            SecretKeyPacket skpKey = new SecretKeyPacket();
            IEnumerator ieSubkeys = tskKey.SubKeys.GetEnumerator();
            while (ieSubkeys.MoveNext()) {
                if (!(ieSubkeys.Current is SecretKeyPacket))
                    throw new System.Exception("Expected a secret key packet, but did not find one!");

                skpKey = (SecretKeyPacket)ieSubkeys.Current;
                if (skpKey.PublicKey.KeyID == lKeyID) {
                    bFound = true;
                    continue;
                }
            }

            // check if the message was encrypted with the primary key
            if (!bFound) {
                if (tskKey.PrimaryKey.PublicKey.KeyID == lKeyID) {
                    skpKey = tskKey.PrimaryKey;
                } else {
                    //theoretically we should never see this exception, as
                    //encrytped message makes sure we only get fitting secret
                    //keys, but just in case someone calls this directly, we
                    //throw an exception
                    throw new System.Exception("No fitting secret key found!");
                }
            }

            BigInteger biKey = acCipher.Decrypt(this.biEncryptedSessionKey, skpKey, strPassphrase);

            this.bEncodedSessionKey = biKey.getBytes();
            DecodeSessionKey();
        }