2017-02-04 8 views
0

私はRSA秘密鍵指数の16進数を常に固定長、つまり512バイトにする必要があります。このために指数自体は2045年から2048年の文字でなければなりません。そして、唯一そのヘクスがここで長さ512のものであろうコードは次のとおりです。Javaで与えられたRSA秘密鍵の固定長指数を生成する方法は?

import java.math.BigInteger; 
import java.security.KeyFactory; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.PrivateKey; 
import java.security.spec.RSAPrivateKeySpec; 

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(2048); 
KeyPair kp1 = kpg.genKeyPair(); 
PrivateKey privateKey1 = kp1.getPrivate(); 

KeyFactory keyFac = KeyFactory.getInstance("RSA"); 
RSAPrivateKeySpec pkSpec1 = keyFac.getKeySpec(privateKey1, RSAPrivateKeySpec.class); 
BigInteger encPrivateKeyExponent = pkSpec1.getPrivateExponent(); 
String encPrivateKeyExponentHex = encPrivateKeyExponent.toString(16); // hex of exponent 

私が直面しています問題は、このです:コードが実行されるたびに、encPrivateKeyExponentHexは、509の範囲で(長さが変化します-512バイト)の長さに依存します。encPrivateKeyExponent。毎回正確に512バイトになるように16進数の長さが必要です。これを確実にする方法はありますか?

答えて

2

固定長の基数表現を直接生成するBigIntegerルーチンはありません。最も簡単な方法は、.toString(16)を使用し、必要に応じて先頭の文字を0でパッドすることです。あなたがプライベートを得るためにKeyFactoryと仕様クラスを必要としない

  • char[] out = new char[512]; // probably best to make 512 a named constant 
    for(int i = 512; --i >= 0;){ 
        out[i] = Character.forDigit (privexpt.intValue()&0xF, 16); 
        privexpt = privexpt.shiftRight(4); 
    } 
    String result = new String (out); 
    

    しかし、2つの点が注意すべき:またはあなたのような固定長の出力ルーチン何かを書くことができます指数;あなたがこの鍵ペアの秘密鍵の操作(複数可)を行うために、いくつかの将来の時間や他の場所で予定がある場合は、RSA KeyPairのプライベート半分は民間指数は良い方法ではありません保存や送信、java.security.interfaces.RSAPrivateKey.getPrivateExponent

  • を実装しています。基本的に約30年間のRSAの実装は、wikipediaの最初の数段落や数十年前の簡単なニュース抜粋やexceprtsからコピーされた何十億ものブログに示されているように、単に「c up d mod n」を行うのではなく、 the wikipedia articleのすべてを読んだり、現代の暗号を実際に知っている作者がテキストを見ると、より効率的な「中国の剰余定理」の計算がサポートされています。 Java暗号は、広く普及している(普遍的ではないが)業界標準のエンコーディング(PKCS8)で、すべての秘密鍵と同様にRSA-CRT秘密鍵をサポートしている。これは、実際には説明されていませんが、トップレベルのインタフェースのjavadocに記載されています。java.security.Key

+0

アプローチと提案に感謝します!心に留めておきます。 – Pratap

関連する問題