View Full Version : [java] leggere i keyring di gpg/pgp
salve a tutti,
insieme ad un mio collega sto cercando di sviluppare un webmail in java che consenta di inviare mail cifrate svincolandosi dall'uso di gpg ma sfruttando semplicemente le chiavi da quest'ultimo generate. Per poterlo fare, tuttavia, mi sono arenato su un problema non da poco: leggere il contenuto dei keyring. Difatti ipotizzando che l'utente nel momento in cui debba inviare la mail abbia a disposizione una chiave pubblica, deve comunque far uso del suo keyring segreto. Ora, leggendo in Rete mi pare di aver capito che convertendo il contenuto del file in formato ASCII, esso sia codificato secondo lo standard Radix-64.
Vorrei sapere se siete a conoscenza di siti in tema, o magari di qualche documento che possa spiegarmi bene come poter estrarre tutte le informazioni necessarie dai keyring in modo tale da poter creare la coppia di chiavi.
Grazie a tutti
ps: sto usando come lib di appoggio quella fornita dal team bouncycastle...
Curiosità... tutto questo per diletto o per un esame???
Radix64 == Base64...o almeno così mi sembra di aver capito...
Questo sotto l'ho fatto io, quindi sei liberissimo di usarlo ;) Anche se è in C++... Non credo che tu abbia problemi a convertirlo...
#include <iostream>
#include <string>
using namespace std;
string Base64Encode(const string &data)
{
const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned int dataLen = data.length();
string res;
for(int i=0; i<dataLen; i+=3)
{
unsigned int triplet;
char tmp[5];
triplet = (data[i] << 16)
+ (((dataLen > (i+1))?data[i+1]:0) << 8)
+ ((dataLen > (i+2))?data[i+2]:0);
tmp[3] = base64[triplet & 0x3F];
tmp[2] = base64[(triplet >> 6) & 0x3F];
tmp[1] = base64[(triplet >> 12) & 0x3F];
tmp[0] = base64[(triplet >> 18) & 0x3F];
tmp[4] = '\0';
res.append(tmp);
}
switch(dataLen % 3)
{
case 1:
res[res.length()-2] = '=';
case 2:
res[res.length()-1] = '=';
}
return res;
}
inline int getBase64Pos(const char c)
{
switch(c)
{
case '+':
return 62;
case '/':
return 63;
default:
if(c >= 'A' && c <= 'Z')
return c - 'A';
else if(c >= 'a' && c <= 'z')
return 26 + c - 'a';
else if(c >= '0' && c <= '9')
return 52 + c - '0';
else
return 0;
}
return -1;
}
string Base64Decode(const string &data)
{
unsigned int dataLen = data.length();
string res("");
if(res[dataLen-1] == '=')
--dataLen;
if(res[dataLen-1] == '=')
--dataLen;
unsigned int buf;
char tmp[4];
for(int i=0; i<dataLen; i+=4)
{
int t1 = 0, t2 = 0, t3 = 0, t4 = 0;
buf = 0;
t1 = getBase64Pos(data[i]);
t2 = getBase64Pos((dataLen > (i+1)) ? data[i+1]:'A');
t3 = getBase64Pos((dataLen > (i+2)) ? data[i+2]:'A');
t4 = getBase64Pos((dataLen > (i+3)) ? data[i+3]:'A');
if(t1 < 0 || t2 < 0 || t3 < 0 || t4 < 0)
return res;
tmp[0] = (t1 << 2) + (t2 >> 4);
tmp[1] = (t2 << 4) + (t3 >> 2);
tmp[2] = (t3 << 6) + t4;
tmp[3] = '\0';
res.append(tmp);
}
return res;
}
diletto e utilità :D
grazie per il codice ... ora vedo un pò come va a finire.. vi tengo informati ...
ma secondo voi, mi sorge un dubbio concettuale ... se io ho il keyring, sia esso segreto o pubblico, posso sfruttarne le informazioni?? io vorrei fare una cosa del tipo:
FileInputStream fis = new FileInputStream(KS_PATH);
KeyStore keyStore = KeyStore.getInstance("jks", "SUN");
keyStore.load((InputStream)fis, KS_PASSWORD.toCharArray());
fis.close();
solo che per ovvi motivi non lo posso fare ... innanzitutto perchè non esiste in bouncycastle, che è la libreria che sto usando per supporto a ElGamal, una classe come KeyStore che mi permetta di leggere da un InputStream ... avete qualche consiglio??[/code]
Ho qualche dubbio... il keyring privato è memorizzato criptato e infatti è necessaria la pwd per poterlo utilizzare....
Dovresti dare un occhio alla doc di pgp che se magari usano un metodo crittografico standard potresti riuscire a tirare fuori le chiavi...
si siamo daccordo su quello che dici, solo che il mio problema principale è quello che nella libreria di supporto che sto utilizzando (bouncycastle) non riesco a trovare alcun metodo che mi permetta di generare un KeyQualcosa a partire da un InputStream ... non è che conoscete qualche altra libreria che supporti ElGamal?? oppure ancora sapete come fare?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.