1. RSA鍵ペアの生成アルゴリズム
/ ** *ランダムRSAキーペア(パブリックとプライベート)を生成します * @return * / パブリック 静的地図<文字列、文字列> createKeyPair()がスロー例外{ 地図 <文字列、文字列> = keyPairMap 新しい新しい HashMapを<> (); // RSAアルゴリズムに基づく鍵生成、 するKeyPairGeneratorするKeyPairGenerator = KeyPairGenerator.getInstance( "RSA" ); //はキージェネレータ、96から1024ビットのキーサイズを初期化する (keyPairGenerator.initialize(1024、SecureRandom.getInstance」をSHA1PRNGは" )); //はに格納された鍵ペアを、キーペア生成 キーペアキーペア= keyPairGenerator.generateKeyPair(); //公開鍵と公開鍵バイト配列を取得し たPublicKey公開= keyPair.getPublic(); バイト [] = publicKeyBytes publicKey.getEncoded(); // プライベート鍵と秘密鍵のバイト配列を取得する のPrivateKeyのPrivateKey = keyPair.getPrivate(); バイト [] = privateKeyBytes privateKey.getEncoded(); //はマップに記憶された進数の文字に変換 keyPairMap.put(PUBLIC_KEY、byte2Hex(publicKeyBytes)); keyPairMap.put(PRIVATE_KEY ,, byte2Hex(privateKeyBytes)); 戻りkeyPairMap; }
2.秘密鍵署名
/ ** *秘密鍵を使用して(RSAアルゴリズムが生成する)データ(通常はデジタル抽象)記号 * @paramの内容 * @param privateKeyString * @return * / パブリック 静的の文字記号(内容文字列、文字列privateKeyString)がスロー例外{ IFを(内容!= nullの && privateKeyString!= nullの &&! ""のequals(コンテンツ)&&! "" .equals(privateKeyString)){ // 秘密鍵取得 のPrivateKeyのPrivateKey = KeyFactory.getInstance( "RSA")を。generatePrivate(新新あるPKCS8EncodedKeySpec(hex2Byte(privateKeyString))) 。 // インスタンス化は、RSA署名使用して暗号化ハッシュアルゴリズムSHAを使用して行わ 署名署名= Signature.getInstance(「SHA1withRSA」); // ロード秘密鍵暗号ハッシュコードが使用 signature.initSign(のPrivateKeyを); / / ハッシュコード生成が暗号化され、ハッシュされ、返さ Signature.update(contents.getBytes( "UTF-8" )); // 符号付き バイト [] = signBytes signature.sign(); 戻りbyte2Hex(signBytesを); } 戻り NULL ; }
公開鍵を使用して3.確認の署名
/ ** *署名データを検証する公開鍵を使用して * @paramの内容 * @param signString * @param publicKeyString * @return * / パブリック 静的 ブール checkSign(文字列の内容、signString文字、文字列publicKeyString)をスロー例外{ IF(=内容= nullの || signString == nullの || publicKeyString == nullの){ リターン falseに; } // 取得した公開鍵 。のPublicKey公開= KeyFactory.getInstance( "RSA")のgeneratePublic(新しい新しい(hex2Byte(publicKeyString))X509EncodedKeySpec); // SHAアルゴリズムにインスタンス化ハッシュは、RSA署名使用して暗号化された 署名の署名= Signature.getInstanceを( "SHA1withRSA" ); //は公共ロード signature.initVerify(公開する); //は、元のデータ更新 Signature.update(contents.getBytes( "UTF-8" )); //は、署名が正しい返す リターンsignature.verify(hex2Byte (signString)); }
--------------------------------------
メソッドツール
/ ** *バイト[]配列は、16進文字に変換されます。2バイト文字の長さの対応を生成する1:2 * @param バイト、入力バイト[]配列 * @return 16進数の文字 * / パブリック 静的文字列byte2Hex(バイト[]バイト){ IF(バイト== NULL ){ 戻り NULL ; } のStringBuilderビルダー = 新しい新規のStringBuilder(); // その文字列に一緒にスプライスされた数の16進文字に各バイトを変換反復バイト[]配列、 のために(INT I = 0; I <bytes.length ; I ++ ){ //[I]&0xffで、16進数の文字に各バイトをバイト変換するとき上位ビットが0である場合、出力は、2つの文字が次に取ら、除去、そう+ 0x100の(プラス1ビット以上)する builder.append(整数。 toString((バイト[I]&0xFFで)+ 0x100の、16).substring(1。 )); } 戻り(builder.toStringを); } / ** *進文字バイト[]配列に変換されます。byte2Hex機能に反して。 * @Param 文字列の16進数の文字列 * @return バイト[]配列 * / パブリック 静的 バイト[] hex2Byte(文字列){ IF(文字列== NULL || String.lengthです()<1。){ 戻り NULL ; } //2バイト文字を生成するので、長さが1に対応する:2、バイト[]配列の長さは、文字列の長さの半分である バイト []バイト= 新しい新しい バイト [String.lengthです()/ 2 ]; // トラバースバイト[]配列文字列の長さの半分は、トラバースの数である ため(INT I = 0; I <String.lengthです()/ 2; I ++ ){ // 取らない変換INT、ある2文字、前 INT高い= Integer.parseInt (String.substring(I * 2、* 2 + I. 1)、16 ); // 2つの文字の後に変換INTであり、撮影していない、 INTローはInteger.parseIntを=(String.substring(I * 2 。1 +、2 + I 2 *)、16 ); // 文字* 16 + int型のint型の値が低いに対応する高い値、バイト値は強いに変換することができます @DD、低高い13×16 + 13 = 221(11011101は小数点-35対応に変換強いバイトバイナリ)として バイト[I]は=(バイト)(* 16 +ハイ・ロー); } 戻りバイト; }