/// <summary> /// Finds a secret key out of the given secret keyring that is able /// to decrypt the current encrypted message and returns its KeyID. /// If such a key is not found, 0 is returned. /// </summary> /// <param name="skrRing">Secret keyring containing all secret keys /// known to the system.</param> /// <returns>Returns the KeyID of the key that is able to decrypt the /// encrypted message.</returns> /// <remarks>No remarks</remarks> public ulong GetFittingKeyID(SecretKeyRing skrRing) { bool bFound = false; IEnumerator ieSessionkeys = esKeys.AsymKeys.GetEnumerator(); while (ieSessionkeys.MoveNext()) { if (!(ieSessionkeys.Current is AsymSessionKeyPacket)) { throw new Exception("Strange Error!"); } AsymSessionKeyPacket askpKey = (AsymSessionKeyPacket)ieSessionkeys.Current; ulong lKeyID = askpKey.KeyID; TransportableSecretKey tskKey = skrRing.Find(lKeyID); if (tskKey != null) { return(lKeyID); } } if (!bFound) { throw new Exception("No fitting secret key was found to decrypt the message!"); } return(0); }
/// <summary> /// Decrypts the current encrypted message using the secret keys /// in skrKeyRing and the given passphrase. /// </summary> /// <param name="skrKeyRing">The secret keyring containing all the /// secret keys know to the sytem.</param> /// <param name="strPassphrase">The passphrase that was used to /// encrypt the secret key material in the key that decrypts /// the message.</param> /// <returns>Returns the message that was encrypted. Usually this is /// an compressed or literal message.</returns> /// <remarks>No remarks</remarks> public Message Decrypt(SecretKeyRing skrKeyRing, string strPassphrase) { TransportableSecretKey tskSecretKey = new TransportableSecretKey(); AsymSessionKeyPacket askpSessionKey = new AsymSessionKeyPacket(); bool bFound = false; // let's see, if we can find a fitting Sessionkey packet IEnumerator ieSessionkeys = esKeys.AsymKeys.GetEnumerator(); while (ieSessionkeys.MoveNext()) { if (!(ieSessionkeys.Current is AsymSessionKeyPacket)) { throw new Exception("Strange Error!"); } AsymSessionKeyPacket askpKey = (AsymSessionKeyPacket)ieSessionkeys.Current; ulong lKeyID = askpKey.KeyID; TransportableSecretKey tskKey = skrKeyRing.Find(lKeyID); if (tskKey != null) { bFound = true; tskSecretKey = tskKey; askpSessionKey = askpKey; } } if (!bFound) { throw new Exception("No fitting secret key was found to decrypt the message!"); } askpSessionKey.DecryptSessionKey(tskSecretKey, strPassphrase); byte[] bKey = askpSessionKey.SessionKey; Packet[] pContent = new Packet[0]; try { SymmetricAlgorithm saAlgo = CipherHelper.CreateSymAlgorithm(askpSessionKey.SymmetricAlgorithm); pContent = sepData.Decrypt(bKey, saAlgo); } catch (Exception e) { throw new System.Exception("Decryption of the Message failed: " + e.Message); } // now we need to look what kind of message was hidden in the // encrypted data // it can be either a literal message LiteralMessage lmLiteral = new LiteralMessage(); try { int iPos = lmLiteral.ParseMessage(pContent); return(lmLiteral); } catch (Exception) {} // or an compressed Message CompressedMessage cmCompressed = new CompressedMessage(); try { int iPos = cmCompressed.ParseMessage(pContent); return(cmCompressed); } catch (Exception) {} throw new System.ArgumentException("Encrypted package content is not a valid message!"); }
/// <summary> /// Finds a secret key out of the given secret keyring that is able /// to decrypt the current encrypted message and returns its KeyID. /// If such a key is not found, 0 is returned. /// </summary> /// <param name="skrRing">Secret keyring containing all secret keys /// known to the system.</param> /// <returns>Returns the KeyID of the key that is able to decrypt the /// encrypted message.</returns> /// <remarks>No remarks</remarks> public ulong GetFittingKeyID(SecretKeyRing skrRing) { bool bFound = false; IEnumerator ieSessionkeys = esKeys.AsymKeys.GetEnumerator(); while (ieSessionkeys.MoveNext()) { if (!(ieSessionkeys.Current is AsymSessionKeyPacket)) throw new Exception("Strange Error!"); AsymSessionKeyPacket askpKey = (AsymSessionKeyPacket)ieSessionkeys.Current; ulong lKeyID = askpKey.KeyID; TransportableSecretKey tskKey = skrRing.Find(lKeyID); if (tskKey != null) { return lKeyID; } } if (!bFound) throw new Exception("No fitting secret key was found to decrypt the message!"); return 0; }
private static void DecryptAndVerify(SecretKeyRing skrSecretKeyRing, PublicKeyRing pkrPublicKeyRing, byte[] bData) { string strMessage = System.Text.Encoding.UTF8.GetString(bData); ArmorTypes atType = new ArmorTypes(); string strRest = ""; string strRadix64 = Armor.RemoveArmor(strMessage, ref atType, ref strRest); if (strRadix64.Length > 0) bData = Radix64.Decode(strRadix64); SharpPrivacy.OpenPGP.Messages.Message mContent = null; if (atType == ArmorTypes.OpenPGPSignature) { string strSignature = ""; string strSignedMessage = Armor.RemoveClearSignatureArmor(strMessage, ref atType, ref strSignature); strSignedMessage = Radix64.DashUnescape(strSignedMessage); strSignedMessage = Radix64.TrimMessage(strSignedMessage); SignedMessage smMessage = new SignedMessage(); Packet[] pPackets = Packet.ParsePackets(strSignature); if (!(pPackets[0] is SignaturePacket)) { MessageBox.Show("Not a valid cleartext signature!"); return; } smMessage.Signature = (SignaturePacket)pPackets[0]; LiteralMessage lmMessage = new LiteralMessage(DataFormatTypes.Text); lmMessage.Text = strSignedMessage; smMessage.MessageSigned = lmMessage; mContent = smMessage; } else { // let us see what kind of message this is EncryptedMessage emMessage = new EncryptedMessage(); try { Packet[] pPackets = Packet.ParsePackets(bData); emMessage.ParseMessage(pPackets); if (emMessage.SymmetricallyEncrypted) { // Query passphrase for symmetrically encrypted message QueryPassphrase qpPassphrase = new QueryPassphrase(); qpPassphrase.ShowMyDialog(); string strPassphrase = qpPassphrase.Passphrase; mContent = emMessage.Decrypt(strPassphrase); } else { ulong lKeyID = emMessage.GetFittingKeyID(skrSecretKeyRing); QueryPassphrase qpPassphrase = new QueryPassphrase(); qpPassphrase.ShowMyDialog(skrSecretKeyRing.Find(lKeyID)); string strPassphrase = qpPassphrase.Passphrase; mContent = emMessage.Decrypt(skrSecretKeyRing, strPassphrase); } while ((!(mContent is LiteralMessage)) && (!(mContent is SignedMessage))) { if (mContent is CompressedMessage) { mContent = ((CompressedMessage)mContent).Uncompress(); } else { MessageBox.Show("This is not a valid OpenPGP message!"); return; } } } catch (Exception ee) { MessageBox.Show("There was an error decrypting your message: " + ee.Message); return; } } LiteralMessage lmContent = new LiteralMessage(); string strDisplay = ""; if (mContent is SignedMessage) { SignedMessage smContent = (SignedMessage)mContent; lmContent = smContent.MessageSigned; strDisplay += "*** OpenPGP Signed Message ***\r\n"; strDisplay += "*** Signature Status: " + smContent.Verify(pkrPublicKeyRing) + " ***\r\n"; strDisplay += "*** Signing Key: " + smContent.Signature.KeyID.ToString("x") + " ***\r\n"; strDisplay += "*** Signing Date: " + smContent.Signature.TimeCreated.ToString() + "***\r\n\r\n"; } else if (mContent is LiteralMessage) { lmContent = (LiteralMessage)mContent; strDisplay += "*** OpenPGP Encrypted Message ***\r\n\r\n"; } else { MessageBox.Show("An error occured: Could not find an encrypted or signed message!", "Error..."); return; } if (lmContent.DataFormat == DataFormatTypes.Text) { strDisplay += lmContent.Text; strDisplay += "\r\n\r\n*** End OpenPGP Message ***\r\n"; PlaintextViewer pvViewer = new PlaintextViewer(); pvViewer.MessageText = strDisplay; pvViewer.Show(); } else { if (MessageBox.Show(strDisplay, "Signature Status...", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1) == DialogResult.OK) { System.Windows.Forms.SaveFileDialog sfdSave = new SaveFileDialog(); sfdSave.OverwritePrompt = true; sfdSave.Filter = "All Files (*.*)|*.*"; sfdSave.FileName = lmContent.Filename; sfdSave.ShowDialog(); if (sfdSave.FileName.Length > 0) { System.IO.FileStream fsOut = new FileStream(sfdSave.FileName, FileMode.CreateNew); System.IO.BinaryWriter bwOut = new BinaryWriter(fsOut); bwOut.Write(lmContent.Binary); bwOut.Close(); fsOut.Close(); } } } }
/// <summary> /// Decrypts the current encrypted message using the secret keys /// in skrKeyRing and the given passphrase. /// </summary> /// <param name="skrKeyRing">The secret keyring containing all the /// secret keys know to the sytem.</param> /// <param name="strPassphrase">The passphrase that was used to /// encrypt the secret key material in the key that decrypts /// the message.</param> /// <returns>Returns the message that was encrypted. Usually this is /// an compressed or literal message.</returns> /// <remarks>No remarks</remarks> public Message Decrypt(SecretKeyRing skrKeyRing, string strPassphrase) { TransportableSecretKey tskSecretKey = new TransportableSecretKey(); AsymSessionKeyPacket askpSessionKey = new AsymSessionKeyPacket(); bool bFound = false; // let's see, if we can find a fitting Sessionkey packet IEnumerator ieSessionkeys = esKeys.AsymKeys.GetEnumerator(); while (ieSessionkeys.MoveNext()) { if (!(ieSessionkeys.Current is AsymSessionKeyPacket)) throw new Exception("Strange Error!"); AsymSessionKeyPacket askpKey = (AsymSessionKeyPacket)ieSessionkeys.Current; ulong lKeyID = askpKey.KeyID; TransportableSecretKey tskKey = skrKeyRing.Find(lKeyID); if (tskKey != null) { bFound = true; tskSecretKey = tskKey; askpSessionKey = askpKey; } } if (!bFound) throw new Exception("No fitting secret key was found to decrypt the message!"); askpSessionKey.DecryptSessionKey(tskSecretKey, strPassphrase); byte[] bKey = askpSessionKey.SessionKey; Packet[] pContent = new Packet[0]; try { SymmetricAlgorithm saAlgo = CipherHelper.CreateSymAlgorithm(askpSessionKey.SymmetricAlgorithm); pContent = sepData.Decrypt(bKey, saAlgo); } catch (Exception e) { throw new System.Exception("Decryption of the Message failed: " + e.Message); } // now we need to look what kind of message was hidden in the // encrypted data // it can be either a literal message LiteralMessage lmLiteral = new LiteralMessage(); try { int iPos = lmLiteral.ParseMessage(pContent); return lmLiteral; } catch (Exception) {} // or an compressed Message CompressedMessage cmCompressed = new CompressedMessage(); try { int iPos = cmCompressed.ParseMessage(pContent); return cmCompressed; } catch (Exception) {} throw new System.ArgumentException("Encrypted package content is not a valid message!"); }