Thomas PORNIN çözümü temelde doğru olduğunu ama benim için işe yaramadı mesela yöntemlerle, çünkü getModulus(), sayısal bir dizeyle sonuçlanan BigInteger döndürürken, standart .Net XML biçiminde Base64 kodlu bayt kullanılır.
Bayt almak için "getModulus(). ToByteArray()" kullanılır. Sonra dizinin ilk elemanını (Exponent hariç) kırpmam gerekiyor çünkü istenmeyen bir sıfır bayt var. (BigInteger imzalı olduğundan, ön bitin işaretini gösterebilmesi için fazladan bir bayt eklediğini varsayalım).
GitHub'da the code gönderdim.
ana biraz:
(böylece özel anahtar maruz bırakarak) bir keypair hiçbir şifreleme ile bu şekilde saklanması
static String getPrivateKeyAsXml(PrivateKey privateKey) throws Exception{
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
RSAPrivateCrtKeySpec spec = keyFactory.getKeySpec(privateKey, RSAPrivateCrtKeySpec.class);
StringBuilder sb = new StringBuilder();
sb.append("<RSAKeyValue>" + NL);
sb.append(getElement("Modulus", spec.getModulus()));
sb.append(getElement("Exponent", spec.getPublicExponent()));
sb.append(getElement("P", spec.getPrimeP()));
sb.append(getElement("Q", spec.getPrimeQ()));
sb.append(getElement("DP", spec.getPrimeExponentP()));
sb.append(getElement("DQ", spec.getPrimeExponentQ()));
sb.append(getElement("InverseQ", spec.getCrtCoefficient()));
sb.append(getElement("D", spec.getPrivateExponent()));
sb.append("</RSAKeyValue>");
return sb.toString();
}
static String getElement(String name, BigInteger bigInt) throws Exception {
byte[] bytesFromBigInt = getBytesFromBigInt(bigInt);
String elementContent = getBase64(bytesFromBigInt);
return String.format(" <%s>%s</%s>%s", name, elementContent, name, NL);
}
static byte[] getBytesFromBigInt(BigInteger bigInt){
byte[] bytes = bigInt.toByteArray();
int length = bytes.length;
// This is a bit ugly. I'm not 100% sure of this but I presume
// that as Java represents the values using BigIntegers, which are
// signed, the byte representation contains an 'extra' byte that
// contains the bit which indicates the sign.
//
// In any case, it creates arrays of 129 bytes rather than the
// expected 128 bytes. So if the array's length is odd and the
// leading byte is zero then trim the leading byte.
if(length % 2 != 0 && bytes[0] == 0) {
bytes = Arrays.copyOfRange(bytes, 1, length);
}
return bytes;
}
static String getBase64(byte[] bytes){
return Base64.getEncoder().encodeToString(bytes);
}
gerçekten, çok kötü bir fikir. – Hut8
Seri hale getirilebilir arabirimi uygulayan anahtar kutusu için kendi sarmalayıcı sınıfınızı oluşturun. ReadObject() ',' writeObject() 've' readObjectNoData() 'yöntemlerini geçersiz kılın. –
@ bowenl2 Diğer platformlarla entegre olmanın iyi bir yolunu önerebilir misiniz? – dvl