Foros del Web » Programación para mayores de 30 ;) » Java »

Signature Decrypt

Estas en el tema de Signature Decrypt en el foro de Java en Foros del Web. Hola, estoy tratando de descifrar una firma teniendo los parámetros y llave publica, al momento de usar la función de Cipher con DECRYPT_MODE y con ...
  #1 (permalink)  
Antiguo 03/11/2017, 15:51
 
Fecha de Ingreso: noviembre-2009
Mensajes: 17
Antigüedad: 15 años
Puntos: 0
Mensaje Signature Decrypt

Hola, estoy tratando de descifrar una firma teniendo los parámetros y llave publica, al momento de usar la función de Cipher con DECRYPT_MODE y con el proveedor de certificado ("SHA-1/DSA", "SUN") obtengo el siguiente error

Código:
java.security.NoSuchAlgorithmException: Invalid transformation format:SHA-1/DSA
Intento cambiar el proveedor Cipher cipher = Cipher.getInstance("SHA-1/DSA", "SUN"); y simpre obtengo ese error.

Lo que si me funciona es la validación de la firma, pero no puedo hacer la inversa de obtener la información que hay dentro de esa firma.

Este es el código para cifrar la información
Código Java:
Ver original
  1. import java.math.BigInteger;
  2. import java.security.InvalidKeyException;
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.NoSuchProviderException;
  8. import java.security.PublicKey;
  9. import java.security.SecureRandom;
  10. import java.security.Signature;
  11. import java.security.SignatureException;
  12. import java.security.interfaces.DSAParams;
  13. import java.security.interfaces.DSAPrivateKey;
  14. import java.security.interfaces.DSAPublicKey;
  15. import java.security.spec.DSAPublicKeySpec;
  16. import java.security.spec.InvalidKeySpecException;
  17. import java.security.spec.KeySpec;
  18. import org.apache.axis.encoding.Base64;
  19.  
  20. public class Prb07 {
  21.  
  22.     public static void main(String[] args) {
  23.         // TODO Auto-generated method stub
  24.         try {
  25.             KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
  26.             SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
  27.             keyGen.initialize(1024, random);
  28.             KeyPair keyPair = keyGen.generateKeyPair();
  29.             DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate();
  30.             DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
  31.             DSAParams dsaParams = privateKey.getParams();
  32.             BigInteger p = dsaParams.getP();
  33.             BigInteger q = dsaParams.getQ();
  34.             BigInteger g = dsaParams.getG();
  35.             BigInteger x = privateKey.getX();
  36.             BigInteger y = dsaPublicKey.getY();
  37.             System.out.println("BigInteger\np: "+p+"\nq: "+q+"\ng: "+g+"\nx: "+x+"\ny: "+y);
  38.            
  39.             KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
  40.             KeySpec publicKeySpec = new DSAPublicKeySpec(y, p, q, g);
  41.             PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
  42.             System.out.println("publicKey: "+publicKey);
  43.            
  44.             System.out.println("EncodeBase64\nP: "+Base64.encode(p.toByteArray())+
  45.                                            "\nQ: "+Base64.encode(q.toByteArray())+
  46.                                            "\nG: "+Base64.encode(g.toByteArray())+
  47.                                            "\nY: "+Base64.encode(y.toByteArray())+
  48.                                            "\nX: "+Base64.encode(x.toByteArray()));
  49.            
  50.             Signature signature = Signature.getInstance( "SHA1withDSA" ,"SUN" );
  51.             signature.initSign(privateKey);
  52.             signature.update("CARLOS|132.20|400|ABC".getBytes()); //Valor que va a contener la firma
  53.             byte[] firmaDigitalByte = signature.sign();
  54.             System.out.println("firma-base64: "+Base64.encode(firmaDigitalByte));
  55.         } catch (NoSuchAlgorithmException e) {
  56.             // TODO Auto-generated catch block
  57.             e.printStackTrace();
  58.         } catch (NoSuchProviderException e) {
  59.             // TODO Auto-generated catch block
  60.             e.printStackTrace();
  61.         } catch (InvalidKeySpecException e) {
  62.             // TODO Auto-generated catch block
  63.             e.printStackTrace();
  64.         } catch (InvalidKeyException e) {
  65.             // TODO Auto-generated catch block
  66.             e.printStackTrace();
  67.         } catch (SignatureException e) {
  68.             // TODO Auto-generated catch block
  69.             e.printStackTrace();
  70.         }
  71.     }
  72.  
  73. }

Y este código para validar y descifrar la información

Código Java:
Ver original
  1. import java.io.UnsupportedEncodingException;
  2. import java.math.BigInteger;
  3. import java.security.InvalidKeyException;
  4. import java.security.Key;
  5. import java.security.KeyFactory;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.NoSuchProviderException;
  8. import java.security.PrivateKey;
  9. import java.security.Provider;
  10. import java.security.PublicKey;
  11. import java.security.Security;
  12. import java.security.Signature;
  13. import java.security.SignatureException;
  14. import java.security.spec.DSAPrivateKeySpec;
  15. import java.security.spec.DSAPublicKeySpec;
  16. import java.security.spec.InvalidKeySpecException;
  17. import java.security.spec.KeySpec;
  18.  
  19. import javax.crypto.BadPaddingException;
  20. import javax.crypto.Cipher;
  21. import javax.crypto.IllegalBlockSizeException;
  22. import javax.crypto.NoSuchPaddingException;
  23.  
  24. import org.apache.axis.encoding.Base64;
  25. import org.apache.commons.codec.DecoderException;
  26. import org.apache.commons.codec.binary.Hex;
  27.  
  28. public class Prb06 {
  29.  
  30.  
  31.     public static void main(String[] args){
  32.         // TODO Auto-generated method stub
  33.         BigInteger x, y, p, q, g;
  34.         y = new BigInteger(Base64.decode("AMadmTWomoI7vER+OyuWVlM+8kEvhD2WvK2O9Pk3PClROsrqTvL/Qdou/I4Iy+0PcSMG7mM3zlqADtwmKqjYYkC37pcQ7fQdiOUQkGV7apb9Kf2Vbo21JO0oPTPq8FqJpSlfvBtu2Kmc0xst0Ue55iDnWkSIVONzIqWcJPn6GAYR"));
  35.         p = new BigInteger(Base64.decode("AP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHH"));
  36.         q = new BigInteger(Base64.decode("AJdgUI8VIwvMspK5gqLrhAvwWBz1"));
  37.         g = new BigInteger(Base64.decode("APfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kq"));
  38.         String firma = "MCwCFDT6jZHwqD/CRWcQd5Zf514C+Mj+AhQoMjmcr4SRYdaxk7GWVOtw/y0Fgg==";
  39.         String comparar = "CARLOS|132.20|400|ABC";
  40.         System.out.println("\nSignature-verify: " + valida(y, p, q, g, firma, comparar) );
  41.     }
  42.     public static boolean valida(BigInteger y, BigInteger p, BigInteger q, BigInteger g,
  43.                                  String firma, String comparar){
  44.         boolean firmaValida = false;
  45.         byte[] firmaByte;
  46.         PublicKey publicKey;
  47.         PrivateKey privateKey;
  48.        
  49.         Signature signature;
  50.         KeyFactory keyFactory;
  51.        
  52.         System.out.println("firma: "+firma+"\nfirma-base64decode: "+ Base64.decode(firma));
  53.         firmaByte = Base64.decode(firma);
  54.         System.out.println("firma-byte: " + firmaByte);
  55.         System.out.println("y: "+y+"\np: "+p+"\nq: "+q+"\ng: "+g);
  56.         try {
  57. //          for (Provider provider: Security.getProviders()) {
  58. //              System.out.println(provider.getName());
  59. //              for (String key2: provider.stringPropertyNames())
  60. //                  System.out.println("\t" + key2 + "\t" + provider.getProperty(key2));
  61. //          }
  62.                
  63.             keyFactory = KeyFactory.getInstance("DSA", "SUN");
  64.             KeySpec publicKeySpec = new DSAPublicKeySpec(y, p, q, g);
  65.             //KeySpec privateKeySpec = new DSAPrivateKeySpec(x, p, q, g);
  66.             publicKey = keyFactory.generatePublic(publicKeySpec);
  67.             //privateKey = keyFactory.generatePrivate(privateKeySpec);
  68.  
  69.             signature = Signature.getInstance("SHA1withDSA" ,"SUN");
  70.             signature.initVerify(publicKey);
  71.             System.out.println(publicKey);
  72.             signature.update(comparar.getBytes("UTF-8"));
  73.             firmaValida = signature.verify( firmaByte );
  74.            
  75.             System.out.println("\nDesencriptando firma");
  76.             Cipher cipher = Cipher.getInstance("SHA-1/DSA", "SUN");
  77.             cipher.init(Cipher.DECRYPT_MODE, publicKey);
  78.             System.out.println("valor: "+new String(cipher.doFinal(firmaByte)));
  79.  
  80.         } catch (NoSuchAlgorithmException e) {
  81.             // TODO Auto-generated catch block
  82.             e.printStackTrace();
  83.         } catch (NoSuchProviderException e1) {
  84.             // TODO Auto-generated catch block
  85.             e1.printStackTrace();
  86.         } catch (InvalidKeyException e) {
  87.             // TODO Auto-generated catch block
  88.             e.printStackTrace();
  89.         } catch (SignatureException e) {
  90.             // TODO Auto-generated catch block
  91.             e.printStackTrace();
  92.         } catch (InvalidKeySpecException e) {
  93.             // TODO Auto-generated catch block
  94.             e.printStackTrace();
  95.         } catch (NoSuchPaddingException e) {
  96.             // TODO Auto-generated catch block
  97.             e.printStackTrace();
  98.         } catch (IllegalBlockSizeException e) {
  99.             // TODO Auto-generated catch block
  100.             e.printStackTrace();
  101.         } catch (BadPaddingException e) {
  102.             // TODO Auto-generated catch block
  103.             e.printStackTrace();
  104.         } catch (UnsupportedEncodingException e) {
  105.             // TODO Auto-generated catch block
  106.             e.printStackTrace();
  107.         }
  108.         return firmaValida;
  109.     }
  110. }

En signature verify me devuelve true, pero con cipher decrypt mode me devuelve el error

Código Java:
Ver original
  1. java.security.NoSuchAlgorithmException: Invalid transformation format:SHA-1/DSA
  2.     at javax.crypto.Cipher.tokenizeTransformation(Cipher.java:310)
  3.     at javax.crypto.Cipher.getTransforms(Cipher.java:417)
  4.     at javax.crypto.Cipher.getInstance(Cipher.java:629)
  5.     at javax.crypto.Cipher.getInstance(Cipher.java:585)
  6.     at Prb06.valida(Prb06.java:76)
  7.     at Prb06.main(Prb06.java:40)
  #2 (permalink)  
Antiguo 13/11/2017, 04:15
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 3 meses
Puntos: 188
Respuesta: Signature Decrypt

Según la documentación las transformaciones aceptadas son las siguientes

Every implementation of the Java platform is required to support the following standard Cipher transformations with the keysizes in parentheses:
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:44.