この記事では、DES対称暗号化アルゴリズムに基づいてJavaによって実装された暗号化と復号化関数について説明します。次のように、参照のために共有してください。
暗号化関連カテゴリ:
Securerandomは、java.util.randomクラスから継承されます
このクラスには3種類のコンストラクターがありますが、次の例は次のとおりです。
securerandom()デフォルトの乱数アルゴリズムを実装する安全な乱数ジェネレーター(RNG)を構築します。
Securerandom(byte [] Seed)は、デフォルトの乱数アルゴリズムを実装する安全な乱数ジェネレーター(RNG)を構築します。
DeskeysPecは、元のキーを使用してキーのキーコンテンツを生成するために使用されます。
DeskeysPecには2つのコンストラクターがあります。
deskeyspec(byte [] key)は、キー内の最初の8バイトをDESキーのキーコンテンツとして使用してDESKEYSPECオブジェクトを作成します。
deskeyspec(byte [] key、int offset)は、des-edeキーのキーコンテンツとして始まり、オフセットを含むキーの最初の8バイトを使用して、deskeyspecオブジェクトを作成します。
SecretKeyFactoryは、キー(タイプキーのOPIC暗号化キー)をキー仕様(基礎となるキー素材の透明な表現)に変換するために使用されるキーファクトリーであり、その逆も同様です。 Secret Key Factoryは、Secret(対称)キーでのみ動作します。
SecretKey Object、Secret Key Objectは、Secret Key FactoryのGeneratedSecret(DeskeysPec Desktop Space)メソッドを呼び出すことにより、シークレットキーを生成します
Cipherクラスは、暗号化と復号化のパスワード機能を提供し、CipherのGetInstance( "des")を呼び出すことでインスタンスを取得します
暗号オブジェクトは、init()メソッドを呼び出してオブジェクトを初期化します。 init()メソッドの特定のパラメーターは、暗号化および復号化された定数を含む特定の状況に従って決定されます。
最後に、暗号化と復号化のためにCipherのdofinal()メソッドを呼び出します。
ここで質問したいと思います。 Base64Encoderを使用した最初のタイプのエンコードであるか、org.apache.commons.commons.commons.commons.commons.binary.base64の2番目のタイプであるかどうか。デコードされていますか?
1. Decoding and Encodingには、sun.misc.base64decoderおよびbase64encoderを使用します
パッケージcom.soufun.com; import java.io.ioexception; Import java.security.nosuchalgorithmexception; Import java.security.securerandom; import java.util.date; Import javax.crypto.cipher; import javax.crypto.crytkey; Import javax.crypty.cryptheytkey; javax.crypto.spec.deskeyspec; //インポート64ビットsun.misc.base64decoder; Import sun.misc.base64encoder;/** *@著者whd * *sun.miscパッケージをインポートする場合でも、エラーが報告されます。この時点で、JREパッケージを削除して再度インポートできます。 */public class desutil {//暗号化メソッドプライベート最終的な静的文字列des = "des";プライベート最終静的文字列UTF8 = "GBK"; Static SecretKeyFactory KeyFactory = null; static {try {keyfactory = secretkeyfactory.getInstance( "des"); } catch(nosuchalgorithmexception e){// todo auto-fenated catch block e.printstacktrace(); }} public static void main(string [] args)throws exception {long begin = new date()。getTime();文字列data = "aaades暗号化テスト"; //注:des暗号化と復号化プロセス中、キーの長さは8の倍数でなければなりません。文字列キー= "qazwsxed"; System.err.println(encrypt(data、key)); system.err.println(decrypt(encrypt(data、key)、key)); long end = new date()。getTime(); system.out.println(end-begin); } / ** *説明キー値に従って暗号化 * @param data * @param key cyncyption key byte array * @return * @throws例外 * / public static string encrypt(string data、string key)throws exception {//指定されたエンコーディングを使用して、エンコップされるコンテンツを取得します。一般に、秘密の鍵はエンコードを指定せずに文字または数字ですが、指定されたものはbyte [] bt = encrypt(data.getBytes(utf8)、key.getBytes(utf8))です。 //注:暗号化と復号化するときは、Sunのbase64Encoder()を使用してエンコードとデコードを使用します。それ以外の場合は、Carled Code./// Iはオンラインで多くのインスタンスを表示しましたが、エンコードとデコードはありません。ここにコードを文字化しているので、base64encoder()を使用してstring strs = new base64encoder()。encode(bt)をデコードします。 strsを返します。 } / ** *説明キー値に応じて復号化 * @param data * @paramキー暗号化キーバイト配列 * @return * @throws ioexception * @throws例外 * / public static string decrypt(string data、string key)throws ioexception、exception {if(data == null)return null; //注:暗号化と復号化するときは、sunのbase64encoder()を使用してエンコードとデコードを使用します。 byte [] buf = decoder.decodebuffer(data); byte [] bt = decrypt(buf、key.getbytes());新しい文字列(bt、utf8)を返します。 } / ** *説明キー値に応じて暗号化 * @param data * @paramキー暗号化キーバイト配列 * @return * @throws例外 * / private static byte [] encrypt(byte [] data、byte [] key)throws {//信頼できるランダム数ソースSecurerandom sr = new Securerandom(); //元のキーデータからDeskeysPecオブジェクトを作成します。つまり、キーDESKEYSPEC dks = new DeskeysPec(key)を作成するキーのキーコンテンツ。 //キーファクトリーは、キー(タイプキーのOPIC暗号化キー)をキー仕様(基礎となるキー素材の透明表現)に変換するために使用され、その逆も同様です。 Secret Key Factoryは、Secret(対称)キーでのみ動作します。 //代わりにSingletonモードを使用します// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(des); //提供されたキー仕様(キーマテリアル)に従って、SecretKey(Key)オブジェクトを生成します。 SecretKey SecureKey = keyFactory.generateSecret(dks); //暗号オブジェクトは実際に暗号化操作を完了し、このクラスは暗号化と復号化のパスワード機能を提供します。 cipher cipher = cipher.getInstance(des); //キーとランダムソースでこの暗号を初期化します。 Encrypt_Modeは、暗号化モードのためにCipherを定数に初期化するために使用されます。 cipher.init(cipher.encrypt_mode、securekey、sr); //暗号化操作の正式な実行cipher.dofinal(data); } / ** *説明キー値に従って復号化 * @param data * @param key necrattingキーバイト配列 * @return * @throws例外 * / private static byte [] decrypt(byte [] data、byte [] key)スロー例外{//信頼できるランダム数ソースSecurerandom sr = new Securerandom(); //元のキーデータからDeskeysPecオブジェクトを作成します。つまり、キーDESKEYSPEC dks = new DeskeysPec(key)を作成するキーのキーコンテンツ。 //キーファクトリーは、キー(タイプキーのOPIC暗号化キー)をキー仕様(基礎となるキー素材の透明表現)に変換するために使用され、その逆も同様です。 Secret Key Factoryは、Secret(対称)キーでのみ動作します。 //代わりにSingletonモードを使用します// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(des); //提供されたキー仕様(キーマテリアル)に従って、SecretKey(Key)オブジェクトを生成します。 SecretKey SecureKey = keyFactory.generateSecret(dks); //暗号クラスは、暗号化と復号化のパスワード機能を提供します。 cipher cipher = cipher.getInstance(des); // decrypt_modeを使用して、復号化モードで暗号を定数に初期化します。 cipher.init(cipher.decrypt_mode、securekey、sr); //正式な復号化操作return cipher.dofinal(data); }}2. org.apache.commons.codec.binary.base64を使用して、デコードしてエンコードします
パッケージcom.soufun.com; import java.io.ioexception; Import java.security.nosuchalgorithmexception; Import java.security.securerandom; import java.util.date; Import javax.crypto.cipher; import javax.crypto.crytkey; Import javax.crypty.cryptheytkey; javax.crypto.spec.deskeyspec; Import org.apache.commons.codec.binary.base64;/** *@著者whd * */public class desutil {// define encryption method private final static string des = "des";プライベート最終静的文字列UTF8 = "GBK"; Static SecretKeyFactory KeyFactory = null; static {try {keyfactory = secretkeyfactory.getInstance( "des"); } catch(nosuchalgorithmexception e){// todo auto-fenated catch block e.printstacktrace(); }} public static void main(string [] args)throws exception {long begin = new date()。getTime();文字列data = "aaades暗号化テスト"; //注:暗号化と復号化中、キーの長さは8の倍数でなければなりません。文字列key = "qazwsxed"; System.err.println(encrypt(data、key)); system.err.println(decrypt(encrypt(data、key)、key)); long end = new date()。getTime(); system.out.println(end-begin); } / ** *説明キー値に従って暗号化 * @paramデータ * @paramキー暗号化キーバイト配列 * @return * / public static string encrypt(string data、string key)throws exception {//指定されたエンコードを使用して、エンコープになっているコンテンツを取得します。一般に、キーはエンコードを指定せずに文字または数字ですが、指定されたものはbyte [] bt = encrypt(data.getBytes(utf8)、key.getBytes())です。 //最初のものはsun.misc.base64encoderを使用します。エンコードされていますが、org.apache.commons.codec.binary.base64を使用する方が良いと言われています。 strsを返します。 } / ** *説明キー値に応じて復号化 * @param data * @paramキー暗号化キーバイト配列 * @return * @throws ioexception * @throws例外 * / public static string decrypt(string data、string key)throws ioexception、exception {if(data == null)return null; // org.apache.commons.codec.binary.base64を使用して、byte [] bas64.decodebase64(data); byte [] bt = decrypt(buf、key.getbytes());新しい文字列(bt、utf8)を返します。 } / ** *説明キー値に従って暗号化 * @param data * @param key encryption key byte array * @return * @throws例外 * / private static byte [] encrypt(byte [] data、byte [] key)スロー{//信頼できるランダム数ソースSecurerandom sr = new Securerandom(); //元のキーデータからDeskeysPecオブジェクトを作成します。つまり、キーDESKEYSPEC dks = new DeskeysPec(key)を作成するキーのキーコンテンツ。 //キーファクトリーは、キー(タイプキーのOPIC暗号化キー)をキー仕様(基礎となるキー素材の透明表現)に変換するために使用され、その逆も同様です。 Secret Key Factoryは、Secret(対称)キーでのみ動作します。 //代わりにSingletonモードを使用します// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(des); //提供されたキー仕様(キーマテリアル)に従って、SecretKey(Key)オブジェクトを生成します。 SecretKey SecureKey = keyFactory.generateSecret(dks); //暗号オブジェクトは実際に暗号化操作を完了し、このクラスは暗号化と復号化のパスワード機能を提供します。 cipher cipher = cipher.getInstance(des); //キーとランダムソースでこの暗号を初期化します。 Encrypt_Modeは、暗号化モードのためにCipherを定数に初期化するために使用されます。 cipher.init(cipher.encrypt_mode、securekey、sr); //暗号化操作の正式な実行cipher.dofinal(data); } / ** *説明キー値に従って復号化 * @param data * @param key necrattingキーバイト配列 * @return * @throws例外 * / private static byte [] decrypt(byte [] data、byte [] key)スロー例外{//信頼できるランダム数ソースSecurerandom sr = new Securerandom(); //元のキーデータからDeskeysPecオブジェクトを作成します。つまり、キーDESKEYSPEC dks = new DeskeysPec(key)を作成するキーのキーコンテンツ。 //キーファクトリーは、キー(タイプキーのOPIC暗号化キー)をキー仕様(基礎となるキー素材の透明表現)に変換するために使用され、その逆も同様です。 Secret Key Factoryは、Secret(対称)キーでのみ動作します。 //代わりにSingletonモードを使用します// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(des); //提供されたキー仕様(キーマテリアル)に従って、SecretKey(Key)オブジェクトを生成します。 SecretKey SecureKey = keyFactory.generateSecret(dks); //暗号クラスは、暗号化と復号化のパスワード機能を提供します。 cipher cipher = cipher.getInstance(des); // decrypt_modeを使用して、復号化モードで暗号を定数に初期化します。 cipher.init(cipher.decrypt_mode、securekey、sr); //正式な復号化操作return cipher.dofinal(data); }}1および2で使用されるパッケージのアドレスをダウンロードします:
ダウンロード:sun.misc.base64decoder。
ダウンロード:Apacheのbase64エンコード、デコーダー。
3.エンコードは使用されず、パッケージを解読します
パッケージcom.soufun.com; Import java.io.ioexception; Import java.security.nosuchalgorithmexception; import java.util.date; Import java.util.hashmap; Import java.util.map; Import javax.crypto.cipher; import.crypto.crypto.secretekey; javax.crypto.secretkeyfactory; Import javax.crypto.spec.deskeyspec; import javax.crypto.spec.ivparameterspec;/** *@著者whd * */public class descrypt {static secretkeyfactory secretkeyfactory = null; // cipherの「アルゴリズム/パターン/塗りつぶし」静的な最終文字列cipher = "des/cbc/pkcs5padding"; static {try {// Secret Key Project SecretKeyFactory = SecretKeyFactory.getInstance( "des"); } catch(nosuchalgorithmexception e){e.printstacktrace(); }} //定義定数、エンコードフォーマットプライベート静的な最終文字列utf8 = "gbk"; /**オブジェクトキャッシュ用のコンテナ*/ static抽象クラスキャッシュ{プライベート最終マップinnercache = new Hashmap();保護された抽象オブジェクトCreateValue(オブジェクトキー)スロー例をスローします。パブリックオブジェクトGET(オブジェクトキー)スロー例外{オブジェクト値。同期(innercache){value = innercache.get(key); if(value == null){value = new CreationPlaceHolder(); innercache.put(key、value); }} if(creationplaceholderの値インスタンス){synchronized(value){creationplaceholder progress =(creationplacholder)value; if(progress.value == null){progress.value = createvalue(key);同期(innercache){innercache.put(key、progress.value); }} return progress.value; }} return値; } static final class creationplaceholder {object value; }} / * * hex-> str&str-> hex * / public static byte [] stringtohex(string ss){// string変換we byte digest [] = new byte [ss.Length() / 2]; for(int i = 0; i <digest.length; i ++){string bytestring = ss.substring(2 * i、2 * i+2); int bytevalue = integer.parseint(bytestring、16);ダイジェスト[i] =(byte)bytevalue; }ダイジェストを返します。 } public static string hextostring(byte b []){stringbuffer hexstring = new StringBuffer(); for(int i = 0; i <b.length; i ++){string plaintext = integer.tohexstring(0xff&b [i]); if(plaintext.length()<2){hexstring.append( "0"); } hexstring.append(plantext); } return hexstring.toString(); } private static byte [] _convertkeyiv(string text)throws ioexception {if(text.length()== 8){return text.getBytes(utf8); } if(text.startswith( "0x")&& text.length()== 32){byte [] result = new byte [8]; for(int i = 0; i <text.length(); i+= 2){if(text.charat(i ++)== '0' && text.charat(i ++)== 'x'){try {result [i / 4] =(byte)integer.parseint(text.substring(i、i+2)、16); } catch(Exception e){throw new ioException( "txt '" + text + "'は無効です!"); }}} return result; } new IOException( "txt '" + text + "'は無効です!"); } /** secretkey&ivparameterspecのキャッシュ* / private static cache secretkeyspecs = new cache(){protected object createvalue(オブジェクトキー)スロー例外try {SecretKeyObj = secretKeyFactory.GenerateSecret(new Deskeyspec(_ConvertKeyiv(((String)Key)))); } catch(Exception e){e.printstacktrace(); } secretkeyobjを返します。 }}; private static cache ivparamspecs = new cache(){protected object createvalue(object key)throws exception {ivparameterspec ivobj = null; ivobj = new ivparameterspec(_convertkeyiv((string)key)); IVOBJを返します。 }}; /** encryption&decryption*/ public static string encrypt(string text、string authkey、string authiv){secretkey secretkeyobj = null; ivparameterspec ivobj = null; try {secretkeyobj =(secretkey)secretkeyspecs.get(authkey); ivobj =(ivparameterspec)ivparamspecs.get(authiv); } catch(Exception e){e.printstacktrace(); } byte [] data = null; try {data = text.getBytes(utf8); } catch(Exception e){e.printstacktrace(); } byte [] authtoken = null; try {authtoken = encrypt(data、secretkeyobj、ivobj); } catch(Exception e){e.printstacktrace(); } hextostring(authtoken)を返します。 } public static byte [] encrypt(byte [] data、secretkey secretkey、ivparameterspec iv)スロー{cipher cipher = cipher.getinstance(cipher); cipher.init(cipher.encrypt_mode、secretkey、iv); cipher.dofinal(data)を返します。 } public static string decrypt(string hexstring、string authkey、string authiv)スロー例外{secretkey secretkeyobj = null; ivparameterspec ivobj = null; try {secretkeyobj =(secretkey)secretkeyspecs.get(authkey); ivobj =(ivparameterspec)ivparamspecs.get(authiv); } catch(Exception e){e.printstacktrace(); } string text = decrypt(hexstring、secretkeyobj、ivobj);テキストを返します。 } public static string decrypt(string message、secretkey secretkey、ivparameterspec iv)スロー{byte [] data = stringtohex(message); return decrypt(data、secretkey、iv); } public static string decrypt(byte [] data、secretkey secretkey、ivparameterspec iv)スロー例外{cipher cipher = cipher.getinstance(cipher); cipher.init(cipher.decrypt_mode、secretkey、iv); byte [] retbyte = cipher.dofinal(data);新しい文字列(retbyte)を返します。 } public static void main(string [] args)スロー例外{long begin = new date()。getTime(); string authkey = "w8f3k9c2"; string authiv = "w8f3k9c2"; string text = "aaades暗号化テスト"; // 140CB412BA03869F // 140CB412BA03869F //元のテキスト文字列necryptedText = encrypt(text、authkey、authiv); system.out.println( "encryptedText:" + encryptedText); // ciphertext文字列plantext = decrypt(encryptedText、authkey、authiv)を復元します。 system.out.println( "plantext:" + plantext); // 2A329740CE15F549BE64190B183A5BBE2 LONG END = NEW DATE()。getTime(); system.out.println(end-begin); }}PS:暗号化と復号化に興味がある友人は、このサイトのオンラインツールを参照することもできます。
パスワードセキュリティオンライン検出:
http://tools.vevb.com/password/my_password_safe
高強度パスワードジェネレーター:
http://tools.vevb.com/password/createstrongpassword
Thunder、Express、およびTornado URL暗号化/復号化ツール:
http://tools.vevb.com/password/urlrethunder
オンラインハッシュ/ハッシュアルゴリズム暗号化ツール:
http://tools.vevb.com/password/hash_encrypt
オンラインMD5/ハッシュ/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160暗号化ツール:
http://tools.vevb.com/password/hash_md5_sha
オンラインSHA1/SHA224/SHA256/SHA384/SHA512暗号化ツール:
http://tools.vevb.com/password/sha_encode
この記事がみんなのJavaプログラミングに役立つことを願っています。