2017-02-04 4 views
0

J'ai besoin que l'hex d'un exposant de clé privée RSA soit toujours de longueur fixe, c'est-à-dire 512 octets. Pour cela, l'exposant lui-même devrait avoir entre 2045 et 2048 caractères. Alors que son hexagone sera de longueur 512. Voici le code:Comment générer un exposant de longueur fixe d'une clé privée RSA donnée en Java?

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 

Le problème que je suis confronté est la suivante: Chaque fois que le code est exécuté, le encPrivateKeyExponentHex varie en longueur (dans la gamme de 509 -512 octets) en fonction de la longueur de encPrivateKeyExponent. J'ai besoin de la longueur hexadécimale pour être exactement 512 octets à chaque fois. Y a-t-il un moyen de garantir cela?

Répondre

2

Il n'existe aucune routine BigInteger qui produit directement une représentation radix de longueur fixe. L'approche la plus simple consiste à utiliser .toString(16) comme vous le faites, puis remplissez les caractères 0 en tant que de besoin. Ou vous pouvez écrire une sortie de routine quelque chose comme de longueur fixe:

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); 

Cependant, deux points à connaître:

  • vous n'avez pas besoin KeyFactory et Spec-classe pour obtenir le privé exposant; la moitié privée de RSA KeyPair implémente java.security.interfaces.RSAPrivateKey.getPrivateExponent

  • si vous avez l'intention, à l'avenir ou tout autre lieu pour effectuer certaines opérations de clé privée (s) pour cette paire de clés, l'enregistrement ou la transmission que l'exposant privé n'est pas une bonne façon. Essentiellement, toutes les implémentations RSA depuis environ 30 ans ne font pas simplement «c up d mod n» comme indiqué dans les premiers paragraphes de wikipedia ou des milliards de blogs copiés à partir de brèves nouvelles ou exceprts d'il y a des décennies, mais utilisent plutôt -key qui prend en charge le calcul 'Chinese Remainder Theorem' plus efficace comme expliqué si vous lisez tous the wikipedia article, ou regardez un texte par un auteur qui connaît réellement la cryptographie moderne. Java crypto prend en charge les clés privées RSA-CRT, comme toutes les clés privées, dans un codage standard de l'industrie (PKCS8) qui est assez largement (mais pas universellement) pris en charge; ceci est noté, mais pas vraiment expliqué, dans javadoc pour l'interface de niveau supérieur java.security.Key

+0

merci pour l'approche et suggestions! Gardera à l'esprit. – Pratap