Convert PEM to PPK
HTML
<script src="http://sayersr-public.s3.amazonaws.com/jsrsasign-latest-all-min.js"></script>
<textarea id="pem" rows="15" cols="65">-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwYQh3pURjmz6L12cQG8MTgRKRy1m/FJekKqOnoikC/8F16Eq
6dkRnMYw5/3apXzJgsJqHXe5vO2Zy+i3U+MAXCGX78Ioz+Wwa5tsu2hMseGbGj89
p1F+Z4qrWGWlq14DdI39ZddOfEuq+dgw2+dDCD9h+KjMsaGReC/tPwS1NapUFLbl
U2UGm+3n9EIgo0Y+mfq1xxMcBvdzLYnLO+TInhiFBY72+VouirhMYyYVWDM9B9Dp
X9PLVEzG/D/f+/AnL9AVBj6nDWqQU4GfNXitFaC9mLbJj8uduQ34IGBRhl1imMwk
uKjkMU0DlJZXhCnVSEbnE1IBDeLB9lfH8J8F7wIDAQABAoIBAQCqSWGcgkSutgr5
/z/uG0oSpQfP1o4XX0xDtTJHIypoPAOiGfqvSQqMkIKcwu/STBru67GBOMfDDroV
izU3pju81vriSlKrjw1Nw7lMuJ00srhPwnK4d6fp6UaaROgiAlq8B+6B3ZL9IYDU
1n84IysDaPMHY1KsxOZDgrkciUIEc9B3mjNSS9yX6oIGRklDmfmRDTvwkCYZ4lR1
tdXYf1+pc52jWo8gn9HtiqAma2lCjO30Frr2Hu0B3OEe1VI28Qox5UlK09V7Ht0p
3jw+0wg3L3IY9qIq3g9vaJOs0dy7VZBixbXdbtvRtm3HihvPcRPjZe43Vk7TR6nz
vG1BzbnxAoGBAP/1cYZ9Yd560ezTJ2Iy/73XBymmgMRJN//iykkeK4KnnFOLjldS
hYTesHbLNu73Gevse2xneBDCRgHLeqVapxJpzHNBCl6KHZpwCigscUDczFYpJX1L
r9WliMJpqQK2KgGY/h+Q9ZPk3HZdHbXdOfdT48FQHTuORFDLgpFFRhKTAoGBAMGM
HQ9Nw4YB4VCT2j8eRZMQSPEASBedUrf/2eMXEZC2d+Z6nTjouEJgzdOC6axuDRtx
abd5GaKdIinp8GF9AQV9eTnXwSRNw5+5LI9ZAZFE8ybvQg5Mk8SJR4di1DVEA6I7
6Lj+YOkUSx+yU6zAcJfy3rSq7BX0JEzyhHQ2Fwy1AoGAMoS4FmpS0b1+B3cZk9kq
/sYdBMx3J8anxdp2QH4y6kO4qAioXHXOIo5tV9T+D6Y3uIfhSGEXon8loB8QIujE
hu7Yynqw2D38X8nzR0CWTc4Gio7udk9k8g8M8go2sHFR0yTmK0bKIZmPJdF1FrsG
QNmO3023p1SKCURRjeiVTv8CgYB443ELLAEh5G69C3xXzCqcrqFAlnJw/Xy7HH0V
UEVSZAYD2TX2Y7UjEJ++qpgVcS+SooXraSJP5WF/WHUiDxfiO/rJ3C7w4/l5/AkP
CALon25YNTzG/aGWMkCRGXN+SZsTa+PyGECjlF9PzuxgjFpHLhVYNyH6nGFIBnog
s+A1uQKBgQDT8YJEQGLGFR+LvdT9mUJOvtJhVdSY/hxHKqnF1o866eIlGvTyEDxt
vkX7qi1cw4b9YkmIh8EOey0wTZg1SjMC0sx4a7/HDdJa318N/SRHkEuuF7KGJs5d
huXPytV8kq6hdTXd4mw/Autv8hm6tQm5B/swd3K3i9MoOdwjzcg8Cw==
-----END RSA PRIVATE KEY-----
</textarea>
<textarea id="ppk" rows="28" cols="65">PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: imported-openssh-key
Public-Lines:...
JavaScript
var crypt = new RSAKey();
crypt.readPrivateKeyFromPEMString($('#pem').val());
var algname = "ssh-rsa";
var cipherstr = "none";
var keycomment = "imported-openssh-key";
var pub_blob = put32bit(algname.length);
var arrE = parseHexString("0"+crypt.e.toString(16)) // something funny about the e value coming back from jsrsasign
var arrN = parseHexString("00" + crypt.n.toString(16));
pub_blob = pub_blob.concat(toByteArray(algname));
pub_blob = pub_blob.concat(put32bit(arrE.length));
pub_blob = pub_blob.concat(arrE);
pub_blob = pub_blob.concat(put32bit(arrN.length));
pub_blob = pub_blob.concat(arrN);
var public_b64 = _arrayBufferToBase64(pub_blob, 64)
var public_lines = public_b64.split('\n').length;
$('#ppk').append('\n');
$('#ppk').append('PuTTY-User-Key-File-2: '+algname+'\n');
$('#ppk').append('Encryption: '+cipherstr+'\n');
$('#ppk').append('Comment: '+keycomment+'\n');
$('#ppk').append("Public-Lines: "+public_lines+"\n" + _arrayBufferToBase64(pub_blob, 64));
$('#ppk').append('\n');
var priv_blob = [];
var arrD = parseHexString("00" + crypt.d.toString(16)); //hmm zero prefixes are needed here for some keysizes
var arrP = parseHexString("00" + crypt.p.toString(16));
var arrQ = parseHexString("00" + crypt.q.toString(16));
var arrCoeff = parseHexString("00" + crypt.coeff.toString(16));
priv_blob = priv_blob.concat(put32bit(arrD.length));
priv_blob = priv_blob.concat(arrD);
priv_blob = priv_blob.concat(put32bit(arrP.length));
priv_blob = priv_blob.concat(arrP);
priv_blob = priv_blob.concat(put32bit(arrQ.length));
priv_blob = priv_blob.concat(arrQ);
priv_blob = priv_blob.concat(put32bit(arrCoeff.length));
priv_blob = priv_blob.concat(arrCoeff);
var private_b64 = _arrayBufferToBase64(priv_blob, 64)
var private_lines = private_b64.split('\n').length;
$('#ppk').append("Private-Lines: " + private_lines + "\n" + private_b64);
$('#ppk').append('\n');
var macdata = put32bit(algname.length);
macdata =...