Cripto TOKEN RSA (ikey2032)

5 respostas
R

Olá a todos!

Bom, estou com um problema que não consigo resolver, estou a 2 dias sem sucesso…

O problema é o seguinte: Tenho que encryptar uma “string”, utilizando RSA, porém sempre tenho como retorno o erro “Comprimento inválido” (Invalid key length).

Ficaria muito grato se alguém me desse uma “luz” sobre o problema… Estou utilizando a API CAPICOM para trabalhar com os tokens…

Segue trechos importantes do código:

----Private Key-----
KeyStore ks = KeyStore.getInstance(“Windows-MY”);
ks.load(null, null);
Key result = ks.getKey(keyname, password.toCharArray());
return result;

----Encryptar String----

String Encrypt = "66480739139775238772";
    String s1 = "";
    

    byte abyte0[] = Base64.base64Decode(Challenge.getBytes());
    
    Cipher cipher = null;

    cipher = Cipher.getInstance(privatekey.getAlgorithm()); 

    cipher.init(1, privatekey);
            
    byte abyte1[] = cipher.doFinal(abyte0); //LINHA DO ERRO

    s1 = new String(Base64.base64Encode(abyte1));

    return s1;

Desde já, muito obrigado!

5 Respostas

E

Não é possível criptografar mais que alguns poucos bytes usando RSA. Além disso, se você for usar um token criptográfico, normalmente não é possível criptografar nada usando RSA, apenas assinar digitalmente.

R

Obrigado cara!

É meu primeiro trabalho de utilizando certificados… até o momento para mim criptografar e assinar eram a mesma coisa…

Aquele modelo de código que enviei peguei da própria “fonte” que utiliza esse recurso…

Número que recebo:
66480739139775238772;

Exemplo de retorno que devo enviar:
AkU+oYpGWqal2EfDoqeuts4ZsHjFrtritt/BmeC1RLC5zgwWHYxX0CFTLeEDftbXsaO+aZEt2YzLtykJAM1TzJa9L2n+wXB93VIO2IefCvRFHDBlZVfuteg2NPfWPcKSi4pw7bWO5qlPe7wGCGjEujkFn3JvAv941N6xZQFKZw=

Com esses dados você consegue mais alguma informação?

Obrigado

E

Ou seja, você tem de gerar 96 bytes (768 bits) correspondentes? Estranho - a chave do seu token é de 512 ou de 1024 ou de 768 bits?

0000    02 45 3E A1 8A 46 5A A6  A5 D8 47 C3 A2 A7 AE B6   .E>..FZ...G.....
0010    CE 19 B0 78 C5 AE DA E2  B6 DF C1 99 E0 B5 44 B0   ...x..........D.
0020    B9 CE 0C 16 1D 8C 57 D0  21 53 2D E1 03 7E D6 D7   ......W.!S-..~..
0030    B1 A3 BE 69 91 2D D9 8C  CB B7 29 09 00 CD 53 CC   ...i.-....)...S.
0040    96 BD 2F 69 FE C1 70 7D  DD 52 0E D8 87 9F 0A F4   ../i■.p}.R.....
0050    45 1C 30 65 65 57 EE B5  E8 36 34 F7 D6 3D C2 92   E.0eeW...64¸.=..

Primeira coisa - provavelmente o número que você tem é um número decimal (BigInteger), que deve ser convertido para os seguintes bytes:

9A 9B 08 04 7F B6 12 74

Ou seja, 8 bytes (64 bits), que é um valor mais razoável para ser criptografado ou assinado via RSA.

R

Meu token é de 1024…

O passo a passo que tenho é pegar a “string” (número), executar a função

Resultado = Base64.base64Decode(“String”.getBytes())

após isso executar

byte Cript[] = cipher.doFinal(Resultado)

e por fim devolver o seguinte:

s1 = new String(Base64.base64Encode(Cript))

A principio parece um procedimento simples, mas mesmo assim da erro… Se conseguirem me dar qualquer dica ficarei extremamente agradecido!

R

Alguém mais consegue me dar alguma ajuda?

Ficarei muito agradecido com qualquer tipo de ajuda!

Obrigado

Criado 20 de agosto de 2010
Ultima resposta 24 de ago. de 2010
Respostas 5
Participantes 2