Java暗号解読(一)暗号化アルゴリズムの紹介と簡単なコードの例


CA(Certification Authoritcation)は、PKIシステムにおいて通信双方が信頼しているエンティティであり、デジタル証明書認証センターの略称であり、デジタル証明書の発行、管理、廃止の機構を指し、信頼できる第三者(Trusted Third Party、TTP)と呼ばれている.CAの役割は、証明書の所有者の身分の正当性を検査し、証明書(証明書に署名)を発行し、証明書が偽造されたり改ざんされたりしないようにし、証明書と鍵を管理することです.
        CAが信頼できる第三者として重要な条件の1つとしてCAの行動が非否定的であることがあげられる.簡単な上司ではなく第三者として、信頼者に自分の責任を追及する能力を持たせなければならない.
CAは証明書により他人の公開鍵情報を確認し,証明書にはCAの署名がある.ユーザが証明書を信頼することによって損失が生じた場合、証明書はCAの法的責任を追及するために有効な証拠として用いることができる.CAが責任を負うという約束をしてくれたからこそ、信頼できる第三者とも呼ばれています.証明書には、公開鍵データと対応する秘密鍵所有者のアイデンティティ情報がバインドされ、CAのデジタル署名が付いています.証明書にはCAの名前も含まれており、依存者がCAの公開鍵を見つけたり、証明書のデジタル署名を検証したりするのに便利です.
        証明書を検証する際にはCAの公開鍵が必要です.ユーザの公開鍵は証明書で証明できるが,CAの公開鍵はどのように取得されるのか.別のCAに証明書を送信させることもできますが、最終的にはCAの公開鍵の取得プロセスが証明書に欠けています.PKI技術は、このような循環問題を自分に残すのではなく、他の安全なチャネルに依存して解決する.CAはそれほど多くないので、放送やテレビ、新聞などで公開されている権威のあるメディアを通じて、さらには赤頭ファイルを公開することでCAの公開鍵を公告することもできます.
        公告CAの公開鍵は様々な形式があり、プログラムの処理に対応するためにCAの公開鍵を証明書の形式で公開することが一般的である.CAは、自分がこの公開鍵を持っていることを証明する証明書(Self-Signed Certificate)を自分に発行します.
        CA自己署名証明書は実際には本物のデジタル証明書ではなく、証明書形式の公開鍵を持っているだけなので、CA自己署名証明書は信頼できる方法から取得する必要があります.例えば、誰もが公私鍵ペアを生成し、自分が信頼できるCAだと主張し、自己署名証明書を発行し、ネットワークを通じて自由に伝播することができる.CA自己署名証明書は、権威あるメディアや対面USBハードディスクなどで転送できます
        デジタル証明書は、認証センターCAが署名したメッセージであり、証明書本体(「証明書申請者」が証明書を所有すると「証明書主体」となる)と証明書に含まれる公開鍵との唯一の対応関係を証明するCAによって発行された声明である.証明書には、証明書申請者の名称および関連情報、申請者の公開鍵、証明書を発行するCAのデジタル署名および証明書の有効期間などが含まれる.1人は認証センターから証明書を取得し、通常は個人または単位の身分を証明する情報を提供します.証明書には主に2つの役割があり、1つは暗号化通信であり、1つはデジタル署名である.
        暗号化通信は、データが他人にキャプチャされず、通信内容が知られないことを保証するもので、主に2つの階層であり、1つは通信双方のアイデンティティ確認であり、相手が偽者であることを回避し、もう1つはデータが公開鍵暗号化によって伝送され、秘密鍵を使用して復号される.この方面でよく見られる具体的な応用はSSLとHTTPSである.
        デジタル署名は署名者のアイデンティティを識別するために用いられ、これは字面から理解できる.あなたはあなたの秘密鍵を使って署名して、それからユーザーはあなたの署名を見てから公開鍵で検査して、確かにあなたのデジタル署名であることを発見して、それでいいです.この一般的なアプリケーションには、コード発行者の署名があります.署名コントロールのようなもの、メールのデジタル署名、電子公印などです.証明書を発行する際に具体的な用途を提供する必要があります.例えば、メール署名、ソフトウェア開発者署名、IPSec暗号化、サーバ通信暗号化など、指定された範囲を超えた用途では信頼できません.
        現在よく使われている証明書はX.509構造を採用しており、これは国際基準です.具体的な証明書パッケージ形式は、PKCS#7、PKCS#10、PKCS#12、CERなどがあり、PKCS#12は公開鍵と秘密鍵を一緒に置いており、証明書所有者の使用に便利である.
        デジタル証明書を生成する方法は2つあり、1つは自分の秘密鍵署名によって自分の信頼できる証明書を生成し、もう1つは証明書を発行したい機関が証明書申請(Certificate Signing Request CSR)を送信し、信頼できる証明書機関が公開鍵に署名し、デジタル証明書を生成する.
        公開鍵と秘密鍵は通称非対称暗号化方式であり、従来の対称暗号化(ユーザ名とパスワードを使用する)方式から向上し、通信者ごとに2つの鍵、すなわち公開鍵と秘密鍵が必要であり、この2つの鍵は互いに復号化することができる.公開鍵は、皆さんに使われています.電子メールで公開することができます.ウェブサイトを通じて他の人にダウンロードさせることができます.公開鍵は実は暗号化に使われています.秘密鍵は、自分のもので、非常に注意して保存しなければなりません.パスワードを加えたほうがいいです.秘密鍵は復号するために使われています.公開鍵と秘密鍵の役割は、公開鍵で暗号化されたコンテンツは秘密鍵でのみ復号でき、秘密鍵で暗号化されたコンテンツは公開鍵でのみ復号できることである.
        公開鍵秘密鍵の原則:
      
1.公開鍵は秘密鍵に対応する.        2.鍵ペアの中で、みんなに知ってもらうのは公開鍵で、みんなに言わないで、自分だけが知っているのは、秘密鍵です.        3.いずれかの鍵でデータを暗号化する場合、対応する鍵のみが復号される.        4.いずれかの鍵でデータを復号することができる場合、データは必然的に対応する鍵によって暗号化される.
        暗号化はデータ資料を暗号化し,不正なユーザが暗号化された資料を取得しても正確な資料内容を取得できないため,データ暗号化はデータを保護し,傍受攻撃を防止することができる.データのセキュリティに重点を置きます.アイデンティティ認証は、あるアイデンティティの真実性を判断するために使用され、アイデンティティを確認してから、システムは異なるアイデンティティによって異なる権限を与えることができる.暗号化とは、情報を符号化して隠すプロセスであり、暗号化する必要があるデータを暗号文と呼び、暗号化されていないデータを明文と呼び、鍵はデータを暗号化および復号するための情報である.
        明文データ-->暗号化(暗号化キー)-->暗号化データ-->復号化(復号化キー)-->明文データ
        公開鍵と秘密鍵を使用する目的は、安全な電子メールを実現することです.
        1.私があなたに送った内容は暗号化しなければなりません.メールの伝送中に他の人に見られません.
        2.私が送ったメールで、他人が私を偽ったのではないことを保証しなければなりません.
        このような目標を達成するには、メールを送信しなければならない2人には、公開鍵と秘密鍵があります.
        例えば、暗号化されたメールを送ります.まず、私はあなたの公開鍵を持っていなければなりません.あなたも私の公開鍵を持っていなければなりません.私はあなたの公開鍵でこのメールを暗号化して、このメールが他の人に見られないことを保証して、しかもこのメールが伝送の過程で修正されていないことを保証します.メールを受け取ったら、秘密鍵で解読でき、内容が見えます.
        次に私は私の秘密鍵でこのメールに暗号化して、あなたの手に送った後、あなたは私の公開鍵で復号することができます.秘密鍵は私の手にしかないので、このメールが私が送ったことを保証しました.
        暗号化は対称暗号化と非対称暗号化に分けられ、同じ鍵を暗号化、復号して対称暗号化となる.暗号化、復号化を用いて異なる鍵を非対称暗号化し、例えば公開鍵で暗号化し、プライベート鍵で復号する.
        対称暗号化アルゴリズム:
DES、AES、IDEA、RC 2、RC 4、SKIPJACK、Blowfishアルゴリズム等(ブロック暗号化アルゴリズム)

  DES          KeyGenerator 
	KenGenerator.getInstance("DES")
          Cipher CipherOutputStream
	Cipher.getInstance("DESede")
	cipher.init(...);
	ciper.update(...);

        非対称暗号化アルゴリズム:
RSA、HDアルゴリズム等(公開鍵暗号化、秘密鍵復号)
       
例1.

public class TestDESEncryDecry {
	private static String str = "1234567812345678";
	public static void main(String[] args) {
		System.out.println("==============  =============");
		System.out.println(str);
		System.out.println();
		byte[] bytes = str.getBytes("utf-8");
		KeyGenerator ken = KeyGenerator.getInstance("DESEDE");
		ken.init(168);
		SecretKey key = ken.generateKey();
		byte[] codes = key.getEncoded();
		if (null != codes) {
			System.out.println("================    ==================");
			for (int j = 0; j < codes.length; j++) {
				System.out.print(codes[j] + ", ");
				if ((j % 8) == 7) {
					System.out.println();
				}
			}
			System.out.println();
			Cipher cipher = Cipher.getInstance("DESede");
			cipher.init(Cipher.ENCRYPT_MODE, key);
			byte[] encryBytest = cipher.doFinal(bytes);
			System.out.println("==============  =================");
			for (int j = 0; j < encryBytest.length; j++) {
				System.out.print(encryBytest[j]+", ");
				if ((j % 8) == 7) {
					System.out.println();
				}
			}
			System.out.println();
			cipher.init(Cipher.DECRYPT_MODE, key);
			byte [] decryBytes = cipher.doFinal(encryBytest);
			String str = new String(decryBytes);
			System.out.println("==============      ===============");
			System.out.println(str);
		}
	}
}

       
例2.

public class TestRSAEncryDecry {
	private static String str = "I have a friend !";
	public static void main(String[] args) {
		try {
			System.out.println("===============  ===============");
			System.out.println(str);
			System.out.println();
			byte [] bytes = str.getBytes("utf-8");
			KeyPairGenerator key = KeyPairGenerator.getInstance("RSA");
			key.initialize(1024);
			KeyPair pair = key.genKeyPair();
			PublicKey pub = pair.getPublic();
			PrivateKey pri = pair.getPrivate();
			//    
			FileOutputStream fos = new FileOutputStream("pub.dat");
			ObjectOutputStream os = new ObjectOutputStream(fos);
			os.writeObject(pub);
			//    
			FileOutputStream fos2 = new FileOutputStream("pri.dat");
			ObjectOutputStream os2 = new ObjectOutputStream(fos2);
			os2.writeObject(pri);
			RSAPublicKey rpub = (RSAPublicKey) pair.getPublic();
			BigInteger e = rpub.getPublicExponent();
			BigInteger n = rpub.getModulus();
			System.out.println("e = "+e+"\r
n = "+n); BigInteger m = new BigInteger(bytes); BigInteger bi = m.modPow(e, n); System.out.println("================= =================="); System.out.println(bi); RSAPrivateKey rpri = (RSAPrivateKey) pair.getPrivate(); BigInteger e2 = rpri.getPrivateExponent(); BigInteger n2 = rpri.getModulus(); BigInteger bi2 = bi.modPow(e2, n2); System.out.println("=============== =================="); byte [] chars = bi2.toByteArray(); for (int j = 0 ; j < chars.length ; j++) { System.out.print((char)chars[j]); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

<>