Qtで暗号化

NSAの仲間は私たちの通信を非常に簡単に見ることができるため、すべての通信を暗号化する必要があるようです。 Qtアプリケーションの開発で暗号化を有効にすることがどれほど難しいかを確認することにしました。 結局のところ、PGPを使用する場合でもすべてが非常に簡単です。



したがって、ここで重要なデータを暗号化するのは開発者の習慣の問題です。



簡単な例でPGPを使用してみましょう。 もちろん、私たちのためにすべてを行う優れたQCAフレームワーク( http://delta.affinix.com/qca/ )が既にあります。 QCAの適切な使用方法を理解するだけです。



入力テキストを暗号化できるシンプルなデスクトップ拡張を作成しましょう。 すでにGnuPGをインストールし 、キーを生成し、受信者キーを受信し、 gpg-agentをインストールして構成し、 pinentry-qt / pinentry-gtkをインストールしてテスト済みであることを前提としています(はい、Linux上にあります)。 次に、 qcaqca-gnupgをインストールする必要があります



emerge --ask qca qca-gnupg







Qt Creatorを実行し、Qt Guiアプリケーションを選択して、そこにqcaを追加します。

 LIBS + = -L / usr / lib / qca2 -lqca
 INCLUDEPATH + = / usr / include / qca2 / QtCrypto


単純なフォームを作成し、ボタンを暗号化スロットに接続します。



main.cppで行う必要があるのは、QtCryptを初期化することだけです。

 #include <QtCrypto>
 #include <QApplication>
 #include "CryptWin.h"
 int main(int argc、char * argv []){
	 QCA ::初期化子の初期化;
	 QApplication a(argc、argv);
	 Cryptwindow w;
	 w.show();
	 return a.exec();
 }




次に、ウィンドウデザイナーで、コンボボックスを初期化するために使用可能なすべてのキーのリストを取得します。

	 QCA :: KeyStoreManager :: start();
	 QCA :: KeyStoreManager ksm(this);
	 ksm.waitForBusyFinished();

	 QCA :: KeyStore pgpks(QString( "qca-gnupg")、&ksm);

	 foreach(const QCA :: KeyStoreEntry kse、pgpks.entryList()){
		 QString text = kse.name()+ "" + kse.id();
		 QVariant v;  v.setValue(kse);
		 ui-> cb_to-> addItem(text、v);
		 if(!kse.pgpSecretKey()。isNull())
			 ui-> cb_my-> addItem(text、v);
	 }


最初の(上の)コンボボックスは、秘密の部分を持つすべてのキー( 送信者 )を受け取り、2番目の(下の)コンボボックスは、公開部分を持つすべてのキー- 受信者を受け取ります。 addItem()へのQVariantデータ引数を使用して、キーをコンボボックス要素に埋め込みます。



「暗号化」ボタン用のスロットのみを書き込むことは残ります。

 void CryptWindow :: encrypt(){
	 QVariant v_my = ui-> cb_my-> itemData(ui-> cb_my-> currentIndex());
	 QVariant v_to = ui-> cb_to-> itemData(ui-> cb_to-> currentIndex());
	 if(!v_my.isValid()){ui-> pte_dst-> setPlainText( "Invalid src"); 帰る  }
	 if(!v_to.isValid()){ui-> pte_dst-> setPlainText( "Invalid dst"); 帰る  }
	 QCA :: KeyStoreEntry kse_my = v_my.value <QCA :: KeyStoreEntry>();
	 QCA :: KeyStoreEntry kse_to = v_to.value <QCA :: KeyStoreEntry>();

	 QCA :: SecureMessageKey to;
	 to.setPGPSecretKey(kse_my.pgpSecretKey());
	 to.setPGPPublicKey(kse_to.pgpPublicKey());

	 QCA :: OpenPGP pgp;
	 QCA :: SecureMessage msg(&pgp);

	 msg.setRecipient(to);
	 msg.setFormat(QCA :: SecureMessage :: Ascii);
	 msg.startEncrypt();
	 msg.update(ui-> pte_src-> toPlainText()。toUtf8());
	 msg.end();
	 msg.waitForFinished(2000);

	 QByteArray crpt = msg.read();
	 ui-> pte_dst-> setPlainText(QString :: fromUtf8(crpt));
 }


アプリケーションを実行してテストしてみましょう(ちなみに、 gpg-agentを介して、選択した秘密鍵のパスワードを要求するため、最初にpinentryの動作を確認することが重要です)。







かなり簡単ですね。 暗号化されています!



(すべてのアプリケーションソースを含む英語版: lynxline.com/qt-and-use-of-cryptography-simple



All Articles