Java 7的预览版似乎缺少JCE包,以实现无限的加密强度.有人偶然发现了这样的事吗?
我现在正在制作RSA消息认证软件.过程如下:
#1代码(如下)工作正常并生成以下结果:
5554c9a9f6838b6cf40d9dbfbab3d90ea27aa6434ed095d289c13c2624617993ad99161ac265276d150510c176341d8ab8600d08b7353286d465e6bd3370a6fd8dd3ffb82916f612fd6dcee5e654ed801cfca6b6d2d5d6dc99ff7921b615abdf62eb67db1f71e6a6ea70012fd35e7cefa1a8d3aab7614c47746cfe1fc2bc875b
但是#2代码显示以下错误:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
我认为#1中的行Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
产生2048位(256字节)的结果.也许这就是问题......记住我使用1024位私钥.
那么#1代码如何生成128字节的结果呢?
1. SignMail.java
public class SignMail {
static {
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
}
public static String sign(String userOriginalMessage) throws Exception {
PEMReader userPrivateKey = new PEMReader(
new InputStreamReader(
new FileInputStream(Environment.getExternalStorageDirectory()+"/pkcs10priv.key")));
KeyPair keyPair = (KeyPair)userPrivateKey.readObject();
byte[] cipherText;
//modified by JEON 20130817
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//encrypt the message using private key
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
cipherText = cipher.doFinal(userOriginalMessage.getBytes());
return new String(Hex.encode(cipherText));
}
} …Run Code Online (Sandbox Code Playgroud) Java Cryptography Extension (JCE) 可以在这里找到,但该页面说
当前版本的 JDK 不需要这些策略文件。此处提供它们是为了与旧版本的 JDK 一起使用。
JDK 9 及更高版本附带并默认使用无限制的策略文件。
这也适用于AdoptOpenJDK 11 吗?或者这仅限于 Oracle 的 JDK?我怎么知道它们可用?
我们已将Java产品配置为仅使用FIPS验证的RSA JCE加密提供程序.但是,当java.security中仅列出RSA库时,该产品将不起作用.因此,有些事情要求来自其他提供商的非FIPS算法.
通过消除过程,我们可以判断哪些罐子是成功运行所必需的,但这并不能告诉我们哪些算法正在被请求,或者由谁来执行.
这似乎是一个经常被问到的问题,但显然我们没有发现正确的文档或Google搜索字符串:是否有任何可靠,方便和一致的机制来确定在正在运行的JVM实例中使用哪些JCE提供程序?
我认为JCA替代JCE很简单.但是,编写一些测试代码以获取我系统上的所有提供程序后显示情况并非如此.
我注意到以下几点:
MD5withRSA是SunRsaSign和SunJSSE)type超出JCE中的算法第1项是有道理的,因为JCA(对我来说)作为JCE提供者的库/数组来挑选.
第2项有点令人困惑,因为它表明JCA不是一组"相同的"JCE提供者; 对于任何和所有"类型"的提供者来说,它都是某种水坑,JCE接口与否.
那么,JCA,它的供应商和JCE之间的工作关系是什么?提供者是否也存在于独立的孤岛中,或者它们是否相互"构建"/它们之间是否存在依赖关系?
对于那些对代码感兴趣的人和提出这个问题的结果,下面列出了它
import java.security.Provider;
import java.security.Security;
import java.util.ArrayList;
public class ConsoleListJca
{
public static void main(String[] args)
{
for (Provider provider : Security.getProviders())
{
System.out.println("Provider: " + provider.getName() + " (ver " + provider.getVersion() + ")");
System.out.print(" Algorithms: ");
ArrayList<String> algos = new ArrayList<String>();
for (Provider.Service service : provider.getServices())
{
algos.add(String.format( "%s (%s)", service.getAlgorithm(), service.getType()));
}
java.util.Collections.sort(algos);
String algorsStr = algos.toString();
// remove [ …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码根据此处X509Certificate的参考资料验证 a 。
static void verifyCertTrust(X509Certificate certificate, Set<X509Certificate> additionalCerts) throws CertificateException, NoSuchAlgorithmException, NoSuchProviderException, CertPathValidatorException, InvalidAlgorithmParameterException, CertPathBuilderException{
Set<X509Certificate> trustedRoots = new HashSet<X509Certificate>();
Set<X509Certificate> intermediateCerts = new HashSet<X509Certificate>();
for (X509Certificate cert : additionalCerts) {
if(isSelfSigned(cert)){
trustedRoots.add(cert);
}
else{
intermediateCerts.add(cert);
}
}
Set<TrustAnchor> trustAnchors = new HashSet<TrustAnchor>();
for (X509Certificate root : trustedRoots) {
trustAnchors.add(new TrustAnchor(root, null));
}
X509CertSelector selector = new X509CertSelector();
selector.setCertificate(certificate);
PKIXParameters parameters = new PKIXBuilderParameters(trustAnchors, selector);
parameters.setRevocationEnabled(false);
CertStore intermediateCertStore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(intermediateCerts), "BC");
parameters.addCertStore(intermediateCertStore);
CertPathBuilder cpb …Run Code Online (Sandbox Code Playgroud) 在很多地方,我看到 Java 代码使用 AES 和 PKCS#5 填充。我不明白这怎么可能行得通。
PKCS#5 填充旨在与块大小 <= 8 字节的密码一起使用。AES 的块大小为 16 字节。所有使用 AES 和 PKCS#5 的代码都是错误的吗?或者框架内部是否使用 PKCS#7 来代替?所讨论的框架是 Sun 提供的 Java、JCE 和 BouncyCastle。
有人可以向我解释为什么这个代码javax.crypto.BadPaddingException: Decryption error在解密密钥时会抛出最后一行吗?
// Given an RSA key pair...
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
// ... and an AES key:
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey aesKey = keyGenerator.generateKey();
// When I encrypt the key with this Bouncy Castle cipher:
Cipher encryptionCipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding", "BC");
encryptionCipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedKey = encryptionCipher.doFinal(aesKey.getEncoded());
// Then trying to decrypt the key with this cipher...
Cipher decryptionCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
decryptionCipher.init(Cipher.DECRYPT_MODE, …Run Code Online (Sandbox Code Playgroud) 在Eclipse的安装过程中(使用Eclipse Installer),我被问到“您信任这些证书吗?”,其中列出了Bouncy Castle的两个证书(一个由Sun签名,一个由Oracle签名)和一个Eclipse的证书(由Sun签名)。如何验证这些证书?

我了解这是JCE(Java密码学扩展)的代码签名证书,即Oracle签署的用于加密,密钥生成和密钥协议以及消息身份验证代码(MAC)算法的证书。我也知道Bouncy Castle通常用于提供与加密有关的算法。
两个问题:
我遇到了与命令行 Jasypt 客户端加密“无法操作”相同的问题,但是该帖子适用于更旧版本的 Java。
我已经检查了为 java 列出的路径(在下面的 java_home 中)并查看 lib\security\policy\unlimited 文件夹和必要的 .jar 文件,但我仍然收到以下错误。
虽然它可能相关,也可能不相关,但我无法让 arg ivGeneratorClassName=RandomIvGenerator 工作,这几乎同样让我发疯。它抛出一个 ClassNotFound 异常,但是当我在 Eclipse 中展开它时,George 类 org.jasypt.iv.RandomIvGenerator 在那里。
Jasypt 输出:
C:\jsypt\bin>encrypt.bat input=SomeVeryLongPassword password=MixItUpALot algorit
hm=PBEWITHHMACSHA256ANDAES_256
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) Client VM 25.171-b11
----ARGUMENTS-------------------
algorithm: PBEWITHHMACSHA256ANDAES_256
input: SomeVeryLongPassword
password: MixItUpALot
----ERROR-----------------------
Operation not possible (Bad input or parameters)
Run Code Online (Sandbox Code Playgroud)
算法列表(格式化为更易读):
C:\jsypt\bin>listAlgorithms.bat
DIGEST ALGORITHMS: [MD2, MD5, SHA, SHA-224, SHA-256, SHA-384, SHA-512]
PBE ALGORITHMS: [PBEWITHHMACSHA1ANDAES_128, PBEWITHHMACSHA1ANDAES_256, PBEWITHHMACSHA224ANDAES_128,
PBEWITHHMACSHA224ANDAES_256, PBEWITHHMACSHA256ANDAES_128, PBEWITHHMACSHA256ANDAES_256, PBEWITHHMACSHA384ANDAES_128,
PBEWITHHMACSHA384ANDAES_256, PBEWITHHMACSHA512ANDAES_128, PBEWITHHMACSHA512ANDAES_256, …Run Code Online (Sandbox Code Playgroud) jce ×10
java ×8
bouncycastle ×3
cryptography ×3
rsa ×3
encryption ×2
adoptopenjdk ×1
aes ×1
certificate ×1
eclipse ×1
jasypt ×1
java-7 ×1
jca ×1
key ×1
provider ×1