Ich finde kein Werkzeug oder Lösungen in Java, die es tun können. Also, ich lese RFC 4253 für Public Key Formatbeschreibung und RFC 4251 für mpint
Beschreibung. Wichtige Teile von RFC 4253. Abschnitt 6,6
The "ssh-rsa" key format has the following specific encoding:
string "ssh-rsa"
mpint e
mpint n
Here the 'e' and 'n' parameters form the signature key blob.
und wichtiger Bestandteil von RFC 4251
mpint
Represents multiple precision integers in two's complement format,
stored as a string, 8 bits per byte, MSB first. Negative numbers
have the value 1 as the most significant bit of the first byte of
the data partition. If the most significant bit would be set for
a positive number, the number MUST be preceded by a zero byte.
Unnecessary leading bytes with the value 0 or 255 MUST NOT be
included. The value zero MUST be stored as a string with zero
bytes of data.
By convention, a number that is used in modular computations in
Z_n SHOULD be represented in the range 0 <= x < n.
Examples:
value (hex) representation (hex)
----------- --------------------
0 00 00 00 00
9a378f9b2e332a7 00 00 00 08 09 a3 78 f9 b2 e3 32 a7
80 00 00 00 02 00 80
-1234 00 00 00 02 ed cc
-deadbeef 00 00 00 05 ff 21 52 41 11
all dies wissen, Code schreiben, ssh-rsa Schlüssel zum Java-Format ist einfach zu konvertieren.
private static int SIZEOF_INT = 4;
private static String key1 = "AAAAB3NzaC1yc2EAAAADAQABAAABAQClAxT5S/WuX04OXBt9R59WcL45OmaU3M5U063lfyja7ovqaVR7/2kHtLF/LoCQCXSZMny8RTCGDjoXD7G/tGsyHFDHCI//Y1VDLE06AlDzrlu69DQY91+6gkhGjH3SF6us5hXlihrbSFLfAlSdkEs8gwSrspVQyuaOf+39dnMddhEDYYg+z0ce82ta/n8xPBWCp60nDEDayNjOsRgzDJKSujNfngjQTL1x6qKJj8BW/P5lLJE1nbMm9BQD9G7glJk86qh1I/tJCnij6On0m6KcdzVz8cU3sBgNeB433kGjJtpxXXmJB6Vuu5IverhyfpiB4hP9WlKa/LSzW+ZIdvl/";
@Test
public void convertkey() throws Exception {
byte[] decoded = java.util.Base64.getDecoder().decode(key1);
try {
ByteBuffer byteBuffer = ByteBuffer.wrap(decoded);
AtomicInteger position = new AtomicInteger();
//first read algorithm, should be ssh-rsa
String algorithm = readString(byteBuffer, position);
System.out.println(algorithm);
assert "ssh-rsa".equals(algorithm);
// than read exponent
BigInteger publicExponent = readMpint(byteBuffer, position);
System.out.println("publicExponent = " + publicExponent);
// than read modulus
BigInteger modulus = readMpint(byteBuffer, position);
System.out.println("modulus = " + modulus);
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(keySpec);
System.out.printf("Modulus: %X%n", modulus);
System.out.printf("Public exponent: %d ... 17? Why?%n", publicExponent);
System.out.printf("See, Java class result: %s, is RSAPublicKey: %b%n", publicKey.getClass().getName(), publicKey instanceof RSAPublicKey);
byte[] pubBytes = publicKey.getEncoded();
SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes);
ASN1Primitive primitive = spkInfo.parsePublicKey();
writePEM("pubPkcs1.pem", "RSA PUBLIC KEY", primitive.getEncoded());
} catch (Exception e) {
e.printStackTrace();
}
}
private BigInteger readMpint(ByteBuffer buffer, AtomicInteger pos){
byte[] bytes = readBytes(buffer, pos);
if(bytes.length == 0){
return BigInteger.ZERO;
}
return new BigInteger(bytes);
}
private String readString(ByteBuffer buffer, AtomicInteger pos){
byte[] bytes = readBytes(buffer, pos);
if(bytes.length == 0){
return "";
}
return new String(bytes, StandardCharsets.US_ASCII);
}
private byte[] readBytes(ByteBuffer buffer, AtomicInteger pos){
int len = buffer.getInt(pos.get());
byte buff[] = new byte[len];
for(int i = 0; i < len; i++) {
buff[i] = buffer.get(i + pos.get() + SIZEOF_INT);
}
pos.set(pos.get() + SIZEOF_INT + len);
return buff;
}
private void writePEM(String fileName, String header, byte[] content) throws IOException{
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
PemObject pemObject = new PemObject(header, content);
PemWriter pemWriter = new PemWriter(fw);
pemWriter.writeObject(pemObject);
pemWriter.close();
}
Ausgang
ssh-rsa
publicExponent = 65537
modulus = 20830840075214895520187085209140532093913000825284169131015003256319574044057453999265862514662442478787476545768050679936827456316397871442660366713280574836948529205417590573371022714192162142283026905055750951413644811120376414428742776306570652231542058994893537065648692533801879404176161589597321580633083481631733302249100913607754671673449460161582195402470090670605789220193388312197339358656479303453367386441996440265509774568364904443092245613429875362588897307051303623648237031289817493491475305022256278911859470009225208699382584578527080735302630318546541433464398236590978005758010444925861059033471
Modulus: A50314F94BF5AE5F4E0E5C1B7D479F5670BE393A6694DCCE54D3ADE57F28DAEE8BEA69547BFF6907B4B17F2E8090097499327CBC4530860E3A170FB1BFB46B321C50C7088FFF6355432C4D3A0250F3AE5BBAF43418F75FBA8248468C7DD217ABACE615E58A1ADB4852DF02549D904B3C8304ABB29550CAE68E7FEDFD76731D76110361883ECF471EF36B5AFE7F313C1582A7AD270C40DAC8D8CEB118330C9292BA335F9E08D04CBD71EAA2898FC056FCFE652C91359DB326F41403F46EE094993CEAA87523FB490A78A3E8E9F49BA29C773573F1C537B0180D781E37DE41A326DA715D798907A56EBB922F7AB8727E9881E213FD5A529AFCB4B35BE64876F97F
Public exponent: 65537 ... 17? Why?
See, Java class result: sun.security.rsa.RSAPublicKeyImpl, is RSAPublicKey: true
Zweite Teil - Java-Objekt als PKCS1 öffentlicher Schlüssel speichern.
Wenn Sie pubkeys.getEncoded() schreiben, haben Sie den öffentlichen Schlüssel pkcs8, der öffentliche RSA-Schlüssel ist anders. Format beschrieben in RFC 3447 Anhang A.1.1
An RSA public key should be represented with the ASN.1 type
RSAPublicKey:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
The fields of type RSAPublicKey have the following meanings:
* modulus is the RSA modulus n.
* publicExponent is the RSA public exponent e.
This question am besonders Ian Boyd Antwort gibt viele Details.
Hüpfburg hat bereits die Klasse SubjectPublicKeyInfo
, um mit dieser Situation umzugehen.
byte[] pubBytes = publicKey.getEncoded();
//writePEM("pubPkcs8.pem", "PUBLIC KEY", pubBytes); // if you need pkcs8
SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes);
ASN1Primitive primitive = spkInfo.parsePublicKey();
writePEM("pubPkcs1.pem", "RSA PUBLIC KEY", primitive.getEncoded());
Inhalt pubPkcs1.pem
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApQMU+Uv1rl9ODlwbfUefVnC+OTpmlNzOVNOt5X8o2u6L6mlUe/9p
B7Sxfy6AkAl0mTJ8vEUwhg46Fw+xv7RrMhxQxwiP/2NVQyxNOgJQ865buvQ0GPdf
uoJIRox90herrOYV5Yoa20hS3wJUnZBLPIMEq7KVUMrmjn/t/XZzHXYRA2GIPs9H
HvNrWv5/MTwVgqetJwxA2sjYzrEYMwySkrozX54I0Ey9ceqiiY/AVvz+ZSyRNZ2z
JvQUA/Ru4JSZPOqodSP7SQp4o+jp9JuinHc1c/HFN7AYDXgeN95BoybacV15iQel
bruSL3q4cn6YgeIT/VpSmvy0s1vmSHb5fwIDAQAB
-----END RSA PUBLIC KEY-----
Überprüfung Ergebnisse mit openssl
$ openssl asn1parse -in pubPkcs1.pem
0:d=0 hl=4 l= 266 cons: SEQUENCE
4:d=1 hl=4 l= 257 prim: INTEGER :A50314F94BF5AE5F4E0E5C1B7D479F5670BE393A6694DCCE54D3ADE57F28DAEE8BEA69547BFF6907B4B17F2E8090097499327CBC4530860E3A170FB1BFB46B321C50C7088FFF6355432C4D3A0250F3AE5BBAF43418F75FBA8248468C7DD217ABACE615E58A1ADB4852DF02549D904B3C8304ABB29550CAE68E7FEDFD76731D76110361883ECF471EF36B5AFE7F313C1582A7AD270C40DAC8D8CEB118330C9292BA335F9E08D04CBD71EAA2898FC056FCFE652C91359DB326F41403F46EE094993CEAA87523FB490A78A3E8E9F49BA29C773573F1C537B0180D781E37DE41A326DA715D798907A56EBB922F7AB8727E9881E213FD5A529AFCB4B35BE64876F97F
265:d=1 hl=2 l= 3 prim: INTEGER :010001
_provide das Code-Snippet für das gleiche:
Code pkcs8 und PKCS1 Format zu konvertieren. ASAP_ Dieser Satz ist der beste Weg, um mehr Downvotes und Stimmen für Ihre Frage zu schließen. Bitte lesen Sie die Hilfe, um zu wissen, wie Sie Fragen stellen können. –
Willkommen bei Stack Overflow! Bitte [bearbeiten] Sie Ihre Frage, um [den Code, den Sie bisher haben] (http://whathaveyoutried.com) anzuzeigen. Sie sollten mindestens einen Umriss (aber vorzugsweise einen [mcve]) des Codes angeben, mit dem Sie Probleme haben, dann können wir versuchen, bei dem spezifischen Problem zu helfen. Sie sollten auch [fragen] lesen. –
Neben dieser unhöflichen Anfrage, so schnell wie möglich Antworten zu geben - bitte verstehen Sie, dass dies kein kostenloser Coding-Service ist, wo Sie Ihre Anforderungen fallen lassen und andere Leute die Arbeit für Sie erledigen. Mit anderen Worten: Was haben Sie versucht, Ihr Problem selbst zu lösen? Welche Forschung hast du gemacht? – GhostCat