接下来的讨论是一个简单的教程,如何在 java 中使用 ECDSA 算法对字符串进行签名,而不使用任何第三方库。但问题是:
这是我的 java 代码中的场景,假设有发送方和接收方:
package sender;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
public class Sign {
public static void main(String[] args) throws Exception {
/*
* Generate a key pair
*/
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
keyGen.initialize(256, random);
KeyPair pair = keyGen.generateKeyPair();
/*
Generate the private and the public key
*/
PrivateKey priv = pair.getPrivate();
/* …Run Code Online (Sandbox Code Playgroud) 我正在开发这个 Java 应用程序,它需要访问“JCE Unlimited Strength”文件,并且我确实安装了它们,并且在我构建解决方案(在 Intellij 中)时它可以正常工作但是当我jar输出时,由于某种原因它给出我这个烦人的错误:
C:\Users\h\whatever\out\artifacts\Accepter_jar>java -cp Accepter.jar Main
org.apache.poi.EncryptedDocumentException: Export Restrictions in place - please install JCE Unlimited Strength Jurisdic
tion Policy files
at org.apache.poi.poifs.crypt.CryptoFunctions.getCipher(CryptoFunctions.java:208)
at org.apache.poi.poifs.crypt.CryptoFunctions.getCipher(CryptoFunctions.java:182)
at org.apache.poi.poifs.crypt.agile.AgileDecryptor.hashInput(AgileDecryptor.java:269)
at org.apache.poi.poifs.crypt.agile.AgileDecryptor.verifyPassword(AgileDecryptor.java:116)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:95)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:282)
at ExcelJob.loadExcelSheet(ExcelJob.java:22)
at Main.main(Main.java:17)
Run Code Online (Sandbox Code Playgroud)
知道有什么问题吗?
我一直在尝试用AES编写加密文件,然后使用JCA中提供的密码流解密它.但是,我在阅读文件时遇到了问题,因为解密会变得混乱.
public class CipherStreams {
public static void main(String[] args) {
try {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
Key k = keygen.generateKey();
Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
aes.init(Cipher.ENCRYPT_MODE, k);
FileOutputStream fs = new FileOutputStream("Encrypyed.txt");
CipherOutputStream out = new CipherOutputStream(fs, aes);
out.write("[Hello:Okay]\nOkay".getBytes());
out.close();
Cipher aes2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
aes2.init(Cipher.DECRYPT_MODE, k);
FileInputStream fis = new FileInputStream("Encrypyed.txt");
CipherInputStream in = new CipherInputStream(fis,aes2);
byte[] b = new byte[8];
int i = in.read(b);
while(i!=-1) {
System.out.print((char)i);
i = in.read(b);
}
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个可以使用 oid 的库,例如1.2.840.10040.4.3并将其转换为其标准名称(在这种情况下SHA1withDSA)
使用org.cesecore.certificates.util.AlgorithmTools,我能够实现一些所需的功能,但它非常有限。
这是当前的代码:
String signatureAlgorithmName = AlgorithmTools.getAlgorithmNameFromOID(oid);
Run Code Online (Sandbox Code Playgroud)
笔记:
标准名称可以在这里找到
我正在编写一些旧代码,需要更新它才能使用另一个加密提供商。我不是 Java 专家。我试图了解使用javax.crypto.Cipher和签署哈希值之间有什么区别java.security.Signature。
现有代码类似于:
Cipher cipher = Cipher.getInstance(CFG_ALGO);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] signature = cipher.doFinal(payload);
Run Code Online (Sandbox Code Playgroud)
我收到的使用新提供程序的示例片段如下所示:
final Signature sign = Signature.getInstance("RSA", SIGNATURE_PROVIDER);
sign.initSign(keystore.getPrivateKey(keyName, keyPass));
sign.update(data);
byte[] signature = sign.sign();
Run Code Online (Sandbox Code Playgroud)
如果我为两者使用相同的提供商,两者之间有什么区别吗?一种方式通常优于另一种方式吗?
我有一个用 openJDK (Amazon Correto 11) 和 openJFX 编写的应用程序。
当我在本地运行应用程序时 - 一切正常。但是当我从网络共享执行应用程序时出现异常:
java.lang.ExceptionInInitializerError
at java.base/javax.crypto.JceSecurityManager.<clinit>(JceSecurityManager.java:65)
at java.base/javax.crypto.Cipher.getConfiguredPermission(Cipher.java:2624)
at java.base/javax.crypto.Cipher.getMaxAllowedKeyLength(Cipher.java:2646)
at java.base/sun.security.ssl.SSLCipher.isUnlimited(SSLCipher.java:540)
at java.base/sun.security.ssl.SSLCipher.<init>(SSLCipher.java:472)
at java.base/sun.security.ssl.SSLCipher.<clinit>(SSLCipher.java:174)
at java.base/sun.security.ssl.CipherSuite.<clinit>(CipherSuite.java:67)
at java.base/sun.security.ssl.SSLContextImpl.getApplicableSupportedCipherSuites(SSLContextImpl.java:348)
at java.base/sun.security.ssl.SSLContextImpl$AbstractTLSContext.<clinit>(SSLContextImpl.java:579)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at java.base/java.security.Provider$Service.getImplClass(Provider.java:1848)
at java.base/java.security.Provider$Service.newInstance(Provider.java:1824)
at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
at java.base/javax.net.ssl.SSLContext.getInstance(SSLContext.java:168)
at org.apache.http.ssl.SSLContexts.createDefault(SSLContexts.java:51)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.getSocketFactory(SSLConnectionSocketFactory.java:194)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.getDefaultRegistry(PoolingHttpClientConnectionManager.java:115)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:122)
at com.mashape.unirest.http.options.Options.refresh(Options.java:72)
at com.mashape.unirest.http.options.Options.<clinit>(Options.java:46)
at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:151)
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
at com.mashape.unirest.request.BaseRequest.asString(BaseRequest.java:56)
at myapp.util.MyTaxNumberValidator$3.run(MyTaxNumberValidator.java:185)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
at java.base/javax.crypto.JceSecurity.<clinit>(JceSecurity.java:120)
... 27 more …Run Code Online (Sandbox Code Playgroud) 在 Java 8 之前,需要在 JDK 中下载并安装 JCE 才能使用它。我没有找到 Java 11 的可下载扩展。有没有办法检查它是否是默认配置的?还是我应该通过配置手动激活它?
我正在尝试使用一些开源java库,并且该库将JCE作为其依赖项之一.如果我使用的是Java 1.6,我是需要单独下载JCE库还是它的一部分?看起来像bountycastle.org(JCE的开源提供商)没有列出1.4+的JCE
我需要验证包含多个值的消息的签名.我唯一的参数是签名,公钥和值本身.用于创建签名的算法是具有192位的椭圆曲线密码术.我已经尝试在网上找到代码示例,但我没有找到任何针对此案例的内容.
有没有人使用java验证这个算法?您能否提供代码或示例链接?
谢谢您的帮助!
我做解密和加密RSA,我用Cipher.getInstance("RSA/NONE/PKCS1Padding");它,我补充说Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());和compile 'org.bouncycastle:bcprov-jdk16:1.45'到 gradle-file。所以这个项目在 Intellij Idea 中运行和工作,
但是如果我生成 .jar 文件并运行它,我有:
java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/NONE/PKCS1Padding
at javax.crypto.Cipher.getInstance(Cipher.java:540)
Run Code Online (Sandbox Code Playgroud)
(由 gradle 的 ShadowJar 任务生成的 .jar)。
为什么我在 Intellij Idea 中的项目 - 工作!在 .jar 文件中 - 不起作用?
是否可以通过ncipher JCE API"重新定位"密钥到pkcs11?我知道您可以通过generatekey命令重新定位,但我不知道如何对现有的JCE密钥执行此操作.第一个提示是"源应用程序",选项似乎不包括JCE.它是否支持除此处列出的选项之外的其他选项,还是应该以不同的方式重新定位?
这里的最终目标是导出通过nCipher的JCE API生成的一对密钥(非对称和对称)(是的,我知道HSM的工作是保护密钥和导出通常不是一个好主意,但这是一个要求).我们能够导出通过PKCS11接口生成的密钥,但不能导出通过JCE生成的密钥,因此我们的想法是,如果我们可以将它从JCE重新定位到PKCS11,我们也可以导出这些密钥.如果还有其他方法可以做到这一点,我们也会对此持开放态度.
最后,在对它们执行nfkminfo时,JCE键显示为"已启用恢复".这是否意味着它们可以出口或者这里的恢复意味着什么呢?
我有以下代码解密文件.
package encryption;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class Decrypter {
private static final String PASSWORD = "t_9Y#i@eT[h3}-7!";
private static final String KEY_ALGORITHM = "PBEWithMD5AndDES";
private static final String CIPHER_ALGORITHM = "RC4"; //Using Salsa20 or HC256 solves the problem
private static final String PROVIDER = "BC";
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider());
File inputFile = new …Run Code Online (Sandbox Code Playgroud) jce ×12
java ×11
cryptography ×3
encryption ×2
jar ×2
security ×2
bouncycastle ×1
ecdsa ×1
gradle ×1
hsm ×1
jca ×1
oid ×1
openjdk-11 ×1
pkcs#11 ×1