java - 如何在不同的程序中使用相同的 IvParameterSpec 对象?

标签 java security aes encryption

我在java中有以下代码用于加密

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;


public class AES
{
  public byte[] encrypted;
  public byte[] original;

  public String originalString,ske;

  Cipher cipher;
  SecretKeySpec skeySpec;
  static IvParameterSpec spec;
  byte [] iv;
  /*public static String asHex (byte buf[])
  {
    StringBuffer strbuf = new StringBuffer(buf.length * 2);
    int i;
    for (i = 0; i < buf.length; i++) {
    if (((int) buf[i] & 0xff) < 0x10)
    strbuf.append("0");
    strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
  }
  return strbuf.toString();
}*/
  public AES()
  {
        try
        {
            String key ="chetan";
            skeySpec = new SecretKeySpec(getMD5(key),"AES"); 
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        }
        catch(Exception ex)
        {ex.printStackTrace();}
  }
   private static byte[] getMD5(String input){
        try{
            byte[] bytesOfMessage = input.getBytes("UTF-8");
            MessageDigest md = MessageDigest.getInstance("MD5");
            return md.digest(bytesOfMessage);
        }  catch (Exception e){
             return null;
        }
    }

public String AESencryptalgo(byte[] text)
{
    String newtext="";
    try
    {
               cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            AlgorithmParameters param = cipher.getParameters();
            IvParameterSpec ivspec=param.getParameterSpec(IvParameterSpec.class);
            iv=ivspec.getIV();
            spec=new IvParameterSpec(iv);
        //AlgorithmParameters params = cipher.getParameters();
        //iv = params.getParameterSpec(IvParameterSpec.class).getIV();
        encrypted = cipher.doFinal(text);

    }
   catch(Exception e)
   {
       e.printStackTrace();
   }
   finally
   {
      newtext=new String(encrypted);
       //System.out.println("ENCRYPTED "+newtext);
       return newtext;
    }
}
public  String AESdecryptalgo(byte[] text)
{
    try
    {

        cipher.init(Cipher.DECRYPT_MODE, skeySpec ,spec);
        original = cipher.doFinal(text);   //Exception occurs here
        originalString = new String(original);
        return originalString;

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {

        return originalString;
    }
}

现在的问题是,当我想在不同程序中加密时使用规范变量时,它会成功加密,但是当我在另一个程序中使用此规范解密相同的数据时,它会给出以下错误和堆栈跟踪:

java.security.InvalidAlgorithmParameterException: Parameters missing
        at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..)
        at com.sun.crypto.provider.AESCipher.engineInit(DashoA13*..)
        at javax.crypto.Cipher.a(DashoA13*..)
        at javax.crypto.Cipher.a(DashoA13*..)
        at javax.crypto.Cipher.init(DashoA13*..)
        at javax.crypto.Cipher.init(DashoA13*..)
        at AES.AESdecryptalgo(AES.java:81)
        at DatabaseClass.InstRecord(DatabaseCLass.java:230)

请告诉我我做错了什么?

最佳答案

它是完全相同的同一台机器吗?您确定您使用的是完全相同的 JVM 吗?您是否安装了正确的 JCE?您可以在工作程序中设置断点并确保您的 JCE 提供程序是 com.sun.crypto 提供程序吗?如果其他方法都失败,也许您可​​以尝试使用 BouncyCaSTLe 提供程序

import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
static {
 Security.addProvider(new BouncyCastleProvider());
}

http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation

关于java - 如何在不同的程序中使用相同的 IvParameterSpec 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469049/

相关文章:

java - Java String 中的字符数

java - 如何在启动启动器应用程序之前等待文件扫描完成

asp.net-mvc - 授权失败时将用户重定向到特定 View ?

java - 如何将 OAEPParameterSpec 添加到 JWE 对象?

使用 AES 和 MAC 进行 Java 加密

go - 你如何在 Go 中加密大文件/字节流?

Java - AES CBC 算法生成 SecretKeySpec 的不同方式

java - Java图形画线性能问题

java - JNDI 因 NameNotFoundException 而失败

security - 任何 Spring Framework 对 REST 安全性的支持?