BigInteger(String)?

8 respostas
ivo_costa

Existe um programa open source que é o openp2m, o programa tem por finalidade compartilhar arquivos por e-mails (e é muito bom). Parando com a propaganda, eu estava olhando o código fonte do programa e vi que tem a função descriptografar e decidi fazer uma gambiarra que implementava aquela função pra descriptografar uma senha. Mas vejam só! no código fonte está sendo declarado uma variável do tipo BigInteger e como paramêtro uma String = “CHAVE”. Achei isso estranho mas mesmo assim fui testar o código, e como esperado da erro nessa parte! Mas como pode o programa funcionar ao baixar via JNLP? Alguém tem ideia?

private static final long serialVersionUID = 3139779829067821991L;
private BigInteger d=new BigInteger("CHAVE");
private RSA rsa = new RSA(d);

site do programa openp2m.sourceforge.net
codigo fonte do programa sourceforge.krugle.com/kse/files/cvs/cvs.sourceforge.net/openp2m/src-core/gui/LoginGUI

8 Respostas

rodrigoallemand

Se a classe for java.lang.BigInteger e receber a string “CHAVE”, vai dar zinabre mesmo…
Mas se for uma classe proprietaria com o nome de BigInteger, ai o cara faz mágica lá dentro…

ViniGodoy

Eles devem ter retirado a chave dos fontes.
Você não achou que eles publicariam a chave interna deles, achou?

T

Provavelmente, se você olhar os fontes ou a documentação vai aprender como é que se gera a tal chave.
Dá a impressão que precisa de um processo um pouco complexo, já que o nome da classe é RSA e provavelmente o tal número é uma chave privada, que deve ser gerada por um processo especial (não dá para simplesmente espetar qualquer número lá.)

ivo_costa

mas pelo o que eu vi (baixei todo o códifo fonte via CVS) ele não faz nada por baixo dos panos com a variável BIgInteger, e eu acho que não tem pra que ele esconder a chave poq é opensource.
Quando eu achar o e-mail desse cara vou perguntar pra ele e posto aqui o segredo da mágica.

public class RSA
{
    public final String encriptar(String original)
    {
        try
        {
            BigInteger numero = new BigInteger(original.getBytes("ISO-8859-1"));
            BigInteger encriptado = this.encrypt(numero);
            String strEncriptado="_"+encriptado.toString(36);
            return strEncriptado;
        }
        catch (UnsupportedEncodingException ex)
        {
            return ex.getMessage();
        }
    }
    public final String desencriptar(String senhaEncriptada) throws NumberFormatException
    {
        String desencriptado;
        if (senhaEncriptada.startsWith("_"))
            desencriptado = new String(this.decrypt(new BigInteger(senhaEncriptada.substring(1),36)).toByteArray());
        else if (senhaEncriptada.startsWith("+"))
            desencriptado = new String(this.decrypt(new BigInteger(senhaEncriptada.substring(1),36)).toByteArray());
        else
            desencriptado = new String(this.decrypt(new BigInteger(senhaEncriptada)).toByteArray());
        return desencriptado;
    }

    private BigInteger publicKey, privateKey, e;
    public RSA(int bitlen)
    {
        SecureRandom r = new SecureRandom();
        BigInteger p = new BigInteger(bitlen / 2, 100, r);
        BigInteger q = new BigInteger(bitlen / 2, 100, r);
        publicKey = p.multiply(q);
        BigInteger m = (p.subtract(BigInteger.ONE))
        .multiply(q.subtract(BigInteger.ONE));
        e = new BigInteger("3");
        while(m.gcd(e).intValue() > 1) e = e.add(new BigInteger("2"));
        privateKey = e.modInverse(m);
    }
    public RSA(BigInteger e, BigInteger privateKey, BigInteger publicKey)
    {
        this.e=e;
        this.privateKey=privateKey;
        this.publicKey=publicKey;
    }
    public RSA(BigInteger privateKey)
    {
        this.e=new BigInteger("5");
        this.privateKey=privateKey;
        this.publicKey=new BigInteger("8496133897567932221559267089164065267221377078566337104866771208480189113695076911576868324903413008512741498700587851315525414979963642608998181269527941");
    }
    public RSA()
    {
        this.e=new BigInteger("5");
        this.privateKey=null;
        this.publicKey=new BigInteger("8496133897567932221559267089164065267221377078566337104866771208480189113695076911576868324903413008512741498700587851315525414979963642608998181269527941");
    }
    private final BigInteger encrypt(BigInteger message)
    {
        return message.modPow(e, publicKey);
    }
    private final BigInteger decrypt(BigInteger message)
    {
        if (privateKey==null)
            MessagesGUI.displayErrorMessage("You shouldn't be seen this, please report it on openp2m page");
        return message.modPow(privateKey, publicKey);
    }
}
T
import java.security.*;
import java.security.interfaces.*;
import javax.crypto.*;
import java.security.spec.*;

class TesteGerarParChaves {
    public static void main(String[] args) throws Exception {
        KeyPairGenerator kg = KeyPairGenerator.getInstance ("RSA");
        RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec (512, RSAKeyGenParameterSpec.F0);
        kg.initialize (spec);
        KeyPair pair = kg.generateKeyPair();
        RSAPublicKey pub = (RSAPublicKey)pair.getPublic();
        System.out.println ("Módulo: " + pub.getModulus());
        
        RSAPrivateKey priv = (RSAPrivateKey)pair.getPrivate();
        System.out.println ("Expoente privado: " + priv.getPrivateExponent());
    }
}

O código acima gera um par de chaves, e as imprime.
Exemplo:

java -cp . TesteGerarParChaves 

Módulo: 822745752228525074597252298347438242707001021645158537197269937316102486
97374534743741140014145636173305025858889747499160960480123945477899368778811693
31
Expoente privado: 54849716815235004973150153223162549513800068109677235813151329
15440683246491513014188189407830052849957131585865556091738456539013515415991747
434310613275

O que o código do Glauber chama de “chave privada” provavelmente é o “expoente privado”, e o que é chamado de “chave pública” é provavelmente o “módulo”.

ivo_costa

Eu também acho que é isso, mas e o new BigInteger(“CHAVE”)?

ps.: eu ainda não achei o e-mail do Glauber.

ps. 2: ninguém poderia me ajudar nesso tópico http://guj.com.br/posts/list/73898.java

Flw!

S

Saudações vi o vosso post e recentemente encotrei o codigo fonte do openp2m e decidir ver como era uma vez que o uso com frequencia.
A mesma duvida surgiu.
Procurei um pouco e encontrei esta classe que supostamente decripta a chave do open mas nao percebo como a posso por a funcionar.
Se quiserem dar uma ajuda agradecia, percebo alguma coisa de java mas nada de algoritmos de encriptação ainda mais este, pelo vi durante a minha pesquisa este meio estranho.
Bem aqui vai a classe para voces verem se podem dar uma ajuda.

/*

  • OpenP2M Crypt Break
  • Encrypt and decrypt password for program OpenP2M.
  • 06/05/2006 - frighetti AT cascavel.pm.org
    */

import java.lang.String;
import java.math.BigInteger;

class RSA

{

private BigInteger n, d, e;
public RSA()
{
	n = new BigInteger("849613389756793222155926708916406526722137707856633" + 
			   "710486677120848018911369507691157686832490341300851" + 
			   "2741498700587851315525414979963642608998181269527941");
	d = new BigInteger("169922677951358644431185341783281305344427541571326" +
			   "742097335424169603782273897848542211926500549462803" +
			   "9077923965408489035118957525416966246759228390003017");
	e = new BigInteger("5");
}

public final String encrypt(String s) {
	return "_" + encrypt(new BigInteger(s.getBytes())).toString(36);
}

private BigInteger encrypt(BigInteger message)
{
	return message.modPow(e, n);
}

public final String decrypt(String s) throws NumberFormatException
{
	return s.startsWith("_") ?
		new String(decrypt(new BigInteger(s.substring(1), 36)).toByteArray()) :
		new String(decrypt(new BigInteger(s)).toByteArray());
}

private BigInteger decrypt(BigInteger message)
{
	return message.modPow(d, n);
}

}

public class openp2m_crypt

{

private String enc = null, dec = null;
public static void main(String[] args)
{
	if (args.length <= 1)
		usage();

	System.out.println(" " + parseargs(args) + "\n");
}

public static void usage()
{
	System.out.println("Usage: \n" +
			   "      java openp2m_crypt [-c <string for crypt> | -d <password crypted>]\n" +
			   "              -c : criptography password for openp2m\n" +
			   "              -d : decriptography password for openp2m\n");
	System.exit(1);
	
}

public static String parseargs(String[] args)
{
	RSA rsa = new RSA();
	
	for (int i = 0; i < args.length; i++)
	{
		if (args[i].equals("-c") && i+1<args.length)
		{
			return rsa.encrypt(args[++i]);
		}
		else if (args[i].equals("-d") && i+1<args.length)
		{
			return rsa.decrypt(args[++i]);
		}
	}

	return "";
}

}

Sami_Koivu

ivo costa:
Eu também acho que é isso, mas e o new BigInteger(“CHAVE”)?

ps.: eu ainda não achei o e-mail do Glauber.

ps. 2: ninguém poderia me ajudar nesso tópico http://guj.com.br/posts/list/73898.java

Flw!

Acho que essa versão com “CHAVE” é antiga. Acho que eles mudaram a estrutura do CVS e a nova versão está dentro da pasta openp2m/src-core

http://openp2m.cvs.sourceforge.net/openp2m/openp2m/src-core/gui/LoginGUI.java?view=log

Se você tiver um usuário para o site source-forge, você consegue mandar um e-mail pro Glauber via o site mesmo: http://sourceforge.net/sendmessage.php?touser=1617181

[]s,
Sami

Criado 9 de novembro de 2007
Ultima resposta 18 de nov. de 2007
Respostas 8
Participantes 6