gpt4 book ai didi

key-management - 如何从我们创建的 keystore 中检索我的公钥和私钥

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:06 24 4
gpt4 key购买 nike

我的任务如下:

  • 从我创建的 keystore 中检索我的公钥和私钥。
  • 使用这些 key 使用我的 RSA 2048 位公钥加密段落。
  • 使用 DSA-SHA-1 签名算法对结果进行数字签名。
  • 将数字签名输出保存在名为 output.dat 的文件中。

下面的程序抛出错误:“java.security.InvalidKeyException:没有安装的提供程序支持此 key :sun.security.provider.DSAPublicKeyImpl”。

import java.security.*;
import java.security.KeyStore.*;
import java.io.*;
import java.security.PublicKey;
import java.security.PrivateKey;
import javax.crypto.Cipher;
import java.nio.charset.*;
import sun.security.provider.*;
import javax.crypto.*;

public class Code {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

try {

/* getting data for keystore */

File file = new File(System.getProperty("user.home") + File.separatorChar + ".keystore");
FileInputStream is = new FileInputStream(file);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());

/*Information for certificate to be generated */
String password = "abcde";
String alias = "mykeys";
String alias1 = "skeys";

String filepath ="C:\\email.txt";

/* getting the key*/
keystore.load(is, password.toCharArray());
PrivateKey key = (PrivateKey)keystore.getKey(alias, "bemylife".toCharArray());
//PrivateKey key = cert1.getPrivateKey();
//PublicKey key1= (PrivateKey)key;

/* Get certificate of public key */
java.security.cert.Certificate cert = keystore.getCertificate(alias);

/* Here it prints the public key*/
System.out.println("Public Key:");
System.out.println(cert.getPublicKey());

/* Here it prints the private key*/
System.out.println("\nPrivate Key:");
System.out.println(key);

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,cert.getPublicKey());

String cleartextFile = "C:\\email.txt";
String ciphertextFile = "D:\\ciphertextRSA.png";

FileInputStream fis = new FileInputStream(cleartextFile);
FileOutputStream fos = new FileOutputStream(ciphertextFile);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);

byte[] block = new byte[32];
int i;
while ((i = fis.read(block)) != -1) {
cos.write(block, 0, i);
}
cos.close();


/* computing the signature*/
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
dsa.initSign(key);
FileInputStream f = new FileInputStream(ciphertextFile);
BufferedInputStream in = new BufferedInputStream(f);
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) >= 0) {
dsa.update(buffer, 0, len);
};
in.close();

/* Here it prints the signature*/
System.out.println("Digital Signature :");
System.out.println( dsa.sign());

/* Now Exporting Certificate */
System.out.println("Exporting Certificate. ");
byte[] buffer_out = cert.getEncoded();
FileOutputStream os = new FileOutputStream(new File("d:\\signedcetificate.cer"));
os.write(buffer_out);
os.close();

/* writing signature to output.dat file */
byte[] buffer_out1 = dsa.sign();
FileOutputStream os1 = new FileOutputStream(new File("d:\\output.dat"));
os1.write(buffer_out1);
os1.close();

} catch (Exception e) {System.out.println(e);}

}
}

最佳答案

您必须将其从 keystore 文件(可能以 .jks 结尾)读取到 java.security.KeyStore 中目的。

/**
* Reads a Java keystore from a file.
*
* @param keystoreFile
* keystore file to read
* @param password
* password for the keystore file
* @param keyStoreType
* type of keystore, e.g., JKS or PKCS12
* @return the keystore object
* @throws KeyStoreException
* if the type of KeyStore could not be created
* @throws IOException
* if the keystore could not be loaded
* @throws NoSuchAlgorithmException
* if the algorithm used to check the integrity of the keystore
* cannot be found
* @throws CertificateException
* if any of the certificates in the keystore could not be loaded
*/
public static KeyStore loadKeyStore(final File keystoreFile,
final String password, final String keyStoreType)
throws KeyStoreException, IOException, NoSuchAlgorithmException,
CertificateException {
if (null == keystoreFile) {
throw new IllegalArgumentException("Keystore url may not be null");
}
LOG.debug("Initializing key store: {}", keystoreFile.getAbsolutePath());
final URI keystoreUri = keystoreFile.toURI();
final URL keystoreUrl = keystoreUri.toURL();
final KeyStore keystore = KeyStore.getInstance(keyStoreType);
InputStream is = null;
try {
is = keystoreUrl.openStream();
keystore.load(is, null == password ? null : password.toCharArray());
LOG.debug("Loaded key store");
} finally {
if (null != is) {
is.close();
}
}
return keystore;
}

一旦您拥有KeyStore,您就可以获得Certificate以及公钥和私钥。

但是使用它来签署文本并将其保存在文件中更加复杂,而且容易出错。看看Sign string using given Public Key并将 getKeyPair 方法替换为使用 KeyStore 的方法。类似

的东西
public static KeyPair getKeyPair(final KeyStore keystore, 
final String alias, final String password) {
final Key key = (PrivateKey) keystore.getKey(alias, password.toCharArray());

final Certificate cert = keystore.getCertificate(alias);
final PublicKey publicKey = cert.getPublicKey();

return KeyPair(publicKey, (PrivateKey) key);
}

(显然有点粗糙,我手头没有 sample )

关于key-management - 如何从我们创建的 keystore 中检索我的公钥和私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com