Criptografia RSA

Estou fazendo um programa e tenho que assinar arquivos com RSA… mas tipo é pedido que se crie uma chave de 1024 bits, um bloco de 128 bytes e criptografar esse bloco com a chave criada.

Eu criei as chaves publicas e privadas de 1024 bits mas quando eu envio para criptografar um bloco de 128 bytes da erro.

Já li a respeito sobre esse erro e sei que é porque não se pode enviar um bloco igual ou maior que a chave para criptografar, mas não tem algum outro método para se fazer isso utilizando somente o RSA?!

Outra duvida, como é que eu poderia criptografar utilizando padding com RSA alguem poderia me dar um exemplo?!

valeu pessoal…

O método padrão de assinar um arquivo com RSA é o PKCS#7, que faz o seguinte:

a) Calcula um hash do arquivo (por exemplo, MD5 ou SHA-1). O hash, em si, tem apenas 16 ou 20 bytes.

b) Criptografa o hash com a chave privada. Isso irá criar uma assinatura de 1024 bits (128 bytes).

Para conferir a assinatura, você calcula novamente o hash do arquivo, e então tenta decifrar, com a chave pública, o hash cifrado. Se o resultado da decifração for idêntico ao hash calculado, então a assinatura bate. Senão, o arquivo foi corrompido de alguma forma.

Toda assinatura digital com RSA funciona assim. Ela não depende do tamanho do arquivo, e sim se o hash pode ser usado com arquivos do tamanho desejado (por exemplo, sabe-se que o SHA-1 não pode ser usado para arquivos maiores que 2^64 - 1 bits, ou seja, 2.305.843.009.213.693.952 bytes. )

Você nunca pode usar o RSA sozinho. Nunca, nunca, nunca.

Existe um ataque ao RSA que permite determinar alguns bits da chave se você usar a mesma chave para criptografar sucessivos blocos.

Portanto, é interessante que você use sempre o RSA com algum outro algoritmo (como o hash - por exemplo, SHA-1 - , para assinaturas, ou um algoritmo simétrico - por exemplo, AES - para criptografia).

A propósito, você está usando as classes de RSA do JDK ou está implementando “no braço” ?

Estou usando a classe RSA do JDK.

Mas tipo quando tento criptografar um bloco de 128 bytes uma exceção é lancada dizendo que não posso enviar mais que 117 bytes.

Outra coisa, se alguem por exemplo alterar o arquivo. Como eu posso determinar em qual ponto exatamente o arquivo foi alterado.

Por exemplo:

Se eu tiver um arquivo assim

aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa

ai alguem muda para

aaaaaaaaabbbaaaaaaaaaa
aabbaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaabbaaaa
aaaaaaaaaaaaaaaaaaaaaa

tem como saber que o b que foi inserido no lugar do a não pertence ao arquivo e tipo troca-lo por branco ou outra coisa?!

Ah sim… ia me esquecendo…

Eu estou gerando uma chave de 1024 bits.

a) De fato, não é possível criptografar mais de 117 bytes quando se usa uma chave de 1024 bits.
b) Para saber onde o arquivo foi alterado, você deve dividi-lo em blocos pequenos, e adicionar um código de correção de erros.
Isso tem a vantagem de você poder detectar alterações e efetuar algumas correções.

[quote=entanglement]a) De fato, não é possível criptografar mais de 117 bytes quando se usa uma chave de 1024 bits.
b) Para saber onde o arquivo foi alterado, você deve dividi-lo em blocos pequenos, e adicionar um código de correção de erros.
Isso tem a vantagem de você poder detectar alterações e efetuar algumas correções.


[/quote]

blz… mas tipo voce onde eu encontro algum exemplo em java ou em qualquer outra linguagem?!

Vá até o fim do artigo que lhe indiquei (que é um bocadinho árduo de entender, mesmo). Lá há links para várias implementações.

blz… valeu

Vamos implementar algo semelhante ao PKCS#7 só para você ver como é que se faz uma assinatura digital. OK?

certo entao… Fico no aguardo!!