Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/11/2017, 15:51
k3admm
 
Fecha de Ingreso: noviembre-2009
Mensajes: 17
Antigüedad: 14 años, 5 meses
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)