トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

CipherTest

一部の情報は非常に古いもの(20年以上前〜)ですので、利用する際はご注意ください(Java 1.4 とか .NET 1.0 とか、Windows 2000 とか)
お問い合せは wiki@shise.net まで。Gmail に転送されるので、スパムは全部カットされます。


 

概要

Cipher を使って、DESによる暗号化・GZIPによる圧縮を行うサンプル。
勉強がてら作ったので、美しいサンプルではない。

ソース

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.spec.SecretKeySpec;

/**
 * CipherInputStream、CipherOutputStream を使用して、
 * ファイルを暗号化するサンプル。
 * ついでに圧縮もする。
 * ちなみに「Cipher」は「サイファー」って読むらしい。
 */
public class CipherTest{

    public static void main(String argv[]) throws Throwable{
        // 引数の数が足りなかったら怒る
        if(argv.length < 4){
            System.out.println("usage : java CipherTest <encode/decode> <inputfile> <outputfile> <key>");
            System.out.println("example:");
            System.out.println("> java CipherTest e test.bmp dest.dat aiueo");
            return;
        }
        
        // 秘密鍵つくるやつ。
        SecretKeySpec myKey;
        // 暗号化機能
        Cipher cipher;
        
        // バイトキー(仮)を用意
        byte[] byteKey = {
            (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
            (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 
        };
        // 引数からキーのバイト列を取る。
        byte[] tmpKey = argv[3].getBytes();
        // バイトキーに当てはめていく。
        for (int i = 0; i < tmpKey.length && i < byteKey.length; i++) {
            byteKey[i] = tmpKey[i];
        }
        // なんか、DESという暗号化の場合、バイトキーは8バイトじゃないと
        // いけないらしい。
        
        // 秘密鍵の構築、暗号化の指定
        myKey  = new SecretKeySpec(byteKey, "DES");
        cipher = Cipher.getInstance("DES");
        
        
        // 汎用ばっふぁ
        int bufferlength     = 1024*2;
        byte[] buffer        = new byte[bufferlength];
        // 汎用入力・出力
        FileInputStream in   = new FileInputStream(argv[1]);
        FileOutputStream out = new FileOutputStream(argv[2]);
        
        
        // 暗号化もーど
        if(argv[0].toLowerCase().equals("encrypt") || argv[0].toLowerCase().equals("e")){
            // 暗号化もーどで、初期化
            cipher.init(Cipher.ENCRYPT_MODE, myKey);
            // 暗号化ストリームを用意
            CipherOutputStream crypt = new CipherOutputStream(out, cipher);
            // 圧縮ストリームを用意
            GZIPOutputStream zip     = new GZIPOutputStream(crypt);
            
            // 読みながら書き込み
            int count = 0;
            while((count=in.read(buffer, 0, bufferlength)) != -1){
                zip.write(buffer, 0, count);
            }
            // 圧縮を完了させる。
            zip.finish();
            // ふらーっしゅ
            zip.flush();
            // 閉じる。
            zip.close();
        }else
        // 符号化モード
        if (argv[0].toLowerCase().equals("decrypt") || argv[0].toLowerCase().equals("d")){
            // 暗号解除モードで初期化
            cipher.init(Cipher.DECRYPT_MODE, myKey);
            // 暗号解除ストリームを用意
            CipherInputStream crypt = new CipherInputStream(in, cipher);
            // 圧縮解除ストリームを用意
            GZIPInputStream zip     = new GZIPInputStream(crypt);
            
            // 読みながら書き込み
            int count = 0;
            while((count=zip.read(buffer, 0, bufferlength)) != -1){
                out.write(buffer, 0, count);
            }
            // 書き込んだストリームを閉じる
            out.flush();
            out.close();
        }
    }
}