署名と署名確認RSAアルゴリズム

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 +ハイ・ロー); 
        } 
        戻りバイト; 
    }

おすすめ

転載: www.cnblogs.com/hello4world/p/12219325.html