java.security.Signature,未初始化对象以进行签名

标签 java rsa

我确实通过调用方法 initSign(Private key) 对签名进行了初始化,但我仍然遇到异常。这是我的代码。

public static boolean verify() throws SignatureException{
    File signed = new File("/Users/main/Documents/workspace/test/src/lorem_ipsum.txt");

    byte[] b = new byte[(int) signed.length()];
    try {
      FileInputStream fileInputStream = new FileInputStream(signed);
      System.out.println("Before read b is: "+ b);
      fileInputStream.read(b);
      for (int i = 0; i < b.length; i++) {
        //System.out.print((char)b[i]);
      }
    } catch (FileNotFoundException e) {
      //System.out.println("File Not Found.");
      e.printStackTrace();
    }
    catch (IOException e1)
    {
      //System.out.println("Error Reading The File.");
      e1.printStackTrace();
    }

    KeyPairGenerator kpg = null;
    try {
      kpg = KeyPairGenerator.getInstance("RSA");
    } catch (NoSuchAlgorithmException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    kpg.initialize(2048);
    KeyPair kp = kpg.genKeyPair();
    PublicKey publicKey = (PublicKey) kp.getPublic();
    PrivateKey privateKey = (PrivateKey) kp.getPrivate();

    Signature sign = null;
    try {
      sign = Signature.getInstance("SHA1withRSA");
    } catch (NoSuchAlgorithmException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
    try {
      sign.initSign((PrivateKey) privateKey);
    } catch (InvalidKeyException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    try {
      sign.initVerify((PublicKey)publicKey);
    } catch (InvalidKeyException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    try {
      sign.update(b);
    } catch (SignatureException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    byte[] signed2 = sign.sign();
    return sign.verify(signed2);

  }  

这是我的异常(exception):

Exception in thread "main" java.security.SignatureException: object not initialized for signing
    at java.security.Signature.sign(Signature.java:524)
    at test.verify(test.java:114)
    at test.main(test.java:215)

有人帮忙吗?谢谢!

最佳答案

不要对签名和验证使用相同的变量“sign”。 sign.initVerify 覆盖 sign.initSign。而是使用一个变量进行签名,另一个变量进行验证。

关于java.security.Signature,未初始化对象以进行签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283244/

相关文章:

java - 如何从 LWJGL 显示器写入视频文件?

c - openmp中的rsa算法

amazon-web-services - txt 中的 AWS EC2 pem key

java - java与go之间的RSA加解密

java - Spring boot java,在另一个属性中使用一个属性

java - 由 Apache POI 创建时 excel 文件中的兼容模式

java - 按键绑定(bind)按钮时按钮不显示

java - 程序在 eclipse 中与库一起工作,但在提取到 jar 时不工作

java - 解码加密消息

java - iOS 和 Java 之间的公钥交换