Criptografia + Private Key a partir de <RSAKeyValue>

4 respostas
vivi_grieco

Pessoal,
como eu faço para gerar uma chave Privada a partir de um arquivo XML gerado em .net ?

o arquivo seria tipo esse:
&lt;RSAKeyValue&gt;
&lt;Modulus&gt;abcdyDdNySesa8sWsd8XRG9rFf1av
hch9BSG+sgCSYumLm5gzeTxrrpSqUf2VYfLp8USqK4uFBX312368wOEfK+C/viScPZn/hKcq
vFpd/gKyXJ0M6Oxybn7qJNjVjGtemQDJJdvUPNyV1bcTq0Ugw9lM2cDBVzqHjxxzzACJnab=
&lt;/Modulus&gt;
&lt;Exponent&gt;AQAB&lt;/Exponent&gt;
<P>/UTBBgeTREzfbV9ev1tKwGtFovxi9BiK5
crZ3Qns3rt+lrd6Xas6tJhAvedGakGP7eeaLHdXZjeXGnqvKzRHw==</P>
&lt;Q&gt;8FBLHPccdNh//dRF7Uf6weB829bz+G+NvVrKJMcOzUr9QuKcyRqfZTslKiC/aG9p1PoFxWpeyoPFwDrqFzTYhw==&lt;/Q&gt;
&lt;DP&gt;MTvTPU3fnscdFbb3MaG4gzuArbgQNFc722pkgoakfOS9RQgf/VjKXoFllz7
05d+z6SHvSGemnEcYtNcbscPt4Q==&lt;/DP&gt;
&lt;DQ&gt;0NOVUihSbB8uqe8sVZ11BEEFfyw9eafGrc
NVYbww2qjNh+/QetlNpfRNiVxHuIMInnBdz31tveHgV/laLqyDxQ==&lt;/DQ&gt;
&lt;InverseQ&gt;X0KxLXzW2glIhkk5lP0OnQVWfTutwo9Qg4DSk/5MtbQMMek8SHju7X9Ae2iL4DDRbWG/5mbrPdQ1yQg+GXCWbw==&lt;/InverseQ&gt;
&lt;D&gt;NCBukE3dm5+xRXEY4qWk3Xe8XFvIHT5vENOzTZE4jz0aBPxzTYLIgbkZP+lXgllc4mricqYSsD3K8vCBMQXEhqHkc6pSiYfesZG3wlujJGRyVoT1pVk5M460RwJfwPsO0TxfYCYU80CIfZNzFIEpGEp6pAUF1TQbnTre11aFjU=&lt;/D&gt;
&lt;/RSAKeyValue&gt;

Vi pesquisando na Internet que tem a classe RSAPrivateCrtKeySpec, só que ela recebe BigInteger como parâmetro.
Alguem sabe como fazer isso?

4 Respostas

vivi_grieco

up… :oops:

T

Vou dar um exemplo.

O módulo é descrito como:
<Modulus>
abcdyDdNySesa8sWsd8XRG9rFf1av
hch9BSG+sgCSYumLm5gzeTxrrpSqUf2VYfLp8USqK4uFBX312368wOEfK+C/viScPZn/hKcq
vFpd/gKyXJ0M6Oxybn7qJNjVjGtemQDJJdvUPNyV1bcTq0Ugw9lM2cDBVzqHjxxzzACJnab=
</Modulus>

Pegue o número e o converta de base-64 para um array de bytes. Isso vai dar:

0000    69 B7 1D C8 37 4D C9 27  AC 6B CB 16 B1 DF 17 44   i...7M.'.k.....D
0010    6F 6B 15 FD 5A BE 17 21  F4 14 86 FA C8 02 49 8B   ok.²Z.......I.
0020    A6 2E 6E 60 CD E4 F1 AE  BA 52 A9 47 F6 55 87 CB   ..n`.....R.G÷U..
0030    A7 C5 12 A8 AE 2E 14 15  F7 D7 6D FA F3 03 84 7C   ........¸.m.¾..|
0040    AF 82 FE F8 92 70 F6 67  FE 12 9C AA F1 69 77 F8   ..&#9632;°.p÷g&#9632;....iw°
0050    0A C9 72 74 33 A3 B1 C9  B9 FB A8 93 63 56 31 AD   ..rt3....¹..cV1.

Uma vez que você tem esse array de bytes, pode usar o construtor de BigDecimal que aceita um array de bytes. Isso você deve fazer com os outros números, para montar um RSAPrivateCrtKeySpec

vivi_grieco

thingol,
fiz isso:

private createPrivateKey(){
		RSAPrivateCrtKeySpec rsaK = new RSAPrivateCrtKeySpec(
				decodeBigDecimal(getModulus()), 
				decodeBigDecimal(getExponent()),
				decodeBigDecimal(getD()), 
				decodeBigDecimal(getP()),
				decodeBigDecimal(getQ()),
				decodeBigDecimal(getDP()),
				decodeBigDecimal(getDQ()), 
				decodeBigDecimal(getInverseQ()));
		
		KeyFactory kf = KeyFactory.getInstance("RSA");
		PrivateKey pk = kf.generatePrivate(rsaK);
		byte[] b = pk.getEncoded();
		
	}
	
	private  BigInteger decodeBigDecimal(String str) throws IOException
	{
	    byte decodedMod[] = Base64.decode(str);
	    return new BigInteger(1, decodedMod);
	}

seria +/- isso? [:)]

T

Acho que sim. Agora tente usar essa chave e veja se você consegue cifrar alguma coisa com ela e decifrá-la em .NET ou então o contrário.

Criado 22 de abril de 2009
Ultima resposta 23 de abr. de 2009
Respostas 4
Participantes 2