如何使用从服务器端传输的公钥加密客户端的会话密钥?
我应该使用Cipher.WRAP_MODE或Cipher.ENCRYPT_MODE?
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, publicKey);
byte[] wrappedSessionKey = cipher.wrap(sessionKey);
Run Code Online (Sandbox Code Playgroud)
我不确定如何使用encrypt_mode加密sessionKey.有人可以帮我吗?
我有几个库,C#,PHP和Android,它们都以相同的方式加密/解密字符串,因此它们彼此兼容,即C#写入并加密数据到数据库,PHP可以成功解密它并返回原始字符串.
我现在需要用标准的Java应用程序做同样的事情,所以我从我的Android库中获取代码并需要库,但我得到了一个例外.据我所知,代码不是特定于Android的,所以它应该不是问题.
以下是我的加密功能
public static String encrypt(String plainPasword)
{
String password = "";
try
{
SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");
IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US-ASCII"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] encoded = cipher.doFinal(plainPasword.getBytes());
password = new String(Base64.encodeBase64(encoded));
}
catch (Exception ex)
{
System.err.println("Encryption Exception: " + ex.toString());
}
return password;
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时,Encryption.encrypt("myString")我得到以下异常:
Encryption Exception: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
Run Code Online (Sandbox Code Playgroud)
正如我所说,这段代码在Android上运行良好,它在运行的地方不应该有任何区别.
感谢您的任何帮助,您可以提供.
UPDATE
我发现由于评论链接,我需要PKCS5Padding而不是7.我现在虽然得到以下异常:
Encryption Exception: java.security.InvalidKeyException: Illegal key size
Run Code Online (Sandbox Code Playgroud) 在很多地方,我看到 Java 代码使用 AES 和 PKCS#5 填充。我不明白这怎么可能行得通。
PKCS#5 填充旨在与块大小 <= 8 字节的密码一起使用。AES 的块大小为 16 字节。所有使用 AES 和 PKCS#5 的代码都是错误的吗?或者框架内部是否使用 PKCS#7 来代替?所讨论的框架是 Sun 提供的 Java、JCE 和 BouncyCastle。
下面的代码片段突出显示了我当前使用AES密码和CTR操作模式实现的加密对象。
import javax.crypto.Cipher;
public abstract class Crypto {
private static final String CIPHER_ALGORITHM = "AES/CTR/NoPadding";
private String AesKeyString = "ByWelFHCgFqivFZrWs89LQ==";
private void setKey() throws NoSuchAlgorithmException{
byte[] keyBytes;
keyBytes = Base64.getDecoder().decode(AesKeyString);
aesKey = new SecretKeySpec(keyBytes, "AES");
}
protected byte[] execute(int mode, byte[] target, byte[] iv)
throws Exception{
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(mode, aesKey, ivSpec);
return cipher.doFinal(target);
}
}
Run Code Online (Sandbox Code Playgroud)
就我而言,getInstance()方法从支持此转换的第一个Provider返回一个实现请求的转换的Cipher对象。
以下是包含我所有可用提供商的列表:
SUN
Alg.Alias.Signature.SHA1/DSA SHA1withDSA
Alg.Alias.Signature.1.2.840.10040.4.3 SHA1withDSA
Alg.Alias.Signature.DSS SHA1withDSA
SecureRandom.SHA1PRNG ImplementedIn Software
KeyStore.JKS sun.security.provider.JavaKeyStore$DualFormatJKS …Run Code Online (Sandbox Code Playgroud) 有人可以向我解释为什么这个代码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) I\xe2\x80\x99m 开始使用 ECC 加密技术开发 Android 应用程序。我已经看到Android嵌入了一些密码学(在这里定义https://developer.android.com/guide/topics/security/cryptography),但它在支持的算法\xe2\x80\x99s参数方面或与Android有关支持API版本。例如,AlgorithmParameters 类仅支持 \xe2\x80\x9cEC\xe2\x80\x9d 参数(又名椭圆曲线加密),Android API 版本 26+(= Android 8.0 及更高版本),这是非常严格的。
\n\n到目前为止,解决方案是使用 JCE 提供程序,如 \xe2\x80\x9cBouncy Castle\xe2\x80\x9d。但是,我在https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html上看到它将在未来的 Android P 中被弃用。Android P 将使用加密技术Conscrypt 中提供的功能(基于 BoringSSL)。
\n\n我希望我的应用程序能够在当前的 Android 版本(>= API 21)上运行,并且我希望它能够在 Android P 上运行,那么我应该使用哪个 JCE 提供程序?
\n\n我尝试过使用Conscrypt,但当我将其安装为安全提供程序时发生崩溃。\n在我的 MainActivity.java 类中,我使用了:
\n\nstatic {\n try {\n Security.insertProviderAt(Conscrypt.newProvider(), 1);\n\n } catch (NoClassDefFoundError e) {\n e.printStackTrace();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我遇到以下崩溃:
\n\njava.lang.UnsatisfiedLinkError:找不到 java.lang.String[] org.conscrypt.NativeCrypto.get_cipher_names(java.lang.String) 的实现(尝试过 Java_org_conscrypt_NativeCrypto_get_1cipher_1names 和 Java_org_conscrypt_NativeCrypto_get_1cipher_1names__Ljava_lang_String_2)
\n\n您知道 Conscript 是否可以与当前的 Android …
在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 Provider,因为我需要公开一些自定义Cipher.延长后CipherSpi和ProviderSpi,我准备再建.所以我问客户端他们定位的Java版本.他们回应:
# java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap3260sr9fp2-20110627_03(SR9 FP2)) IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260sr9-20110624_85526 (JIT enabled, AOT enabled) J9VM - 20110624_085526 JIT - r9_20101028_17488ifx17
GC - 20101027_AA)
JCL - 20110530_01
#
Run Code Online (Sandbox Code Playgroud)
该死的.所以他们在AIX机器上使用IBM Java 1.6.0.
我编写了大部分定制的JCE提供程序来支持所需的功能(使用如何实现提供程序指南),从包中扩展ProviderSpi和CipherSpi抽象类com.sun.*.我是否需要获取IBM Java JDK并从中扩展抽象类com.ibm.*?或者我可以使用我的Sun-rooted Java代码签名证书来签署我的JCE提供程序JAR,并将其直接放到AIX系统上的正确位置?(其中一个是愚蠢的,但我不知道哪个).
我对JCE/JVM风格知之甚少,不知道我现在是否需要一个基于IBM的Java代码签名证书(如果有的话),或者Sun-rooted签名是否足够?
我有一些代码已经工作了很长时间,通过HTTP从webapps获取数据.它使用Apache HTTPClient(v.4.5.2),适用于有和没有SSL的站点.
最近,我试图使用if用于其他恰好使用SNI的网站.一切都在我的Windows机器上运行良好,但如果我尝试在AWS EC2 Linux实例上运行它,我会得到握手失败(因为SNI).
这是我正在运行的:
我不确定哪个组件最终导致失败(Java 8,运行时环境,HTTPClient).
我已经看过这个(https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension),但我不知道如何为HTTPClient调整它.此外,如果我必须更改代码,为什么它可以在Windows上运行?
任何人都知道我应该做什么?
编辑:根据建议,我查看了jsse.enableSNIExtension属性.这似乎是错误的,因为它似乎是一种关闭SSL的方法,这不是我想要的.
我尝试在Windows上打开/关闭它,事情只适用于它.在Linux上,当它打开时,我继续获得握手失败.
这是输出:
Windows - System.setProperty("jsse.enableSNIExtension", "false");
=================================================================
pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 189
pool-1-thread-1, READ: TLSv1.2 Alert, length = 2
pool-1-thread-1, RECV TLSv1.2 ALERT: fatal, internal_error
pool-1-thread-1, called closeSocket()
pool-1-thread-1, handling exception: javax.net.ssl.SSLException: Received fatal alert: internal_error
Windows - System.setProperty("jsse.enableSNIExtension", "true");
================================================================
pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 215
pool-1-thread-1, READ: TLSv1.2 …Run Code Online (Sandbox Code Playgroud) jce ×10
java ×9
encryption ×4
aes ×3
bouncycastle ×3
cryptography ×2
aix ×1
android ×1
boringssl ×1
certificate ×1
ctr-mode ×1
eclipse ×1
jasypt ×1
pkcs#7 ×1
rsa ×1
sni ×1
ssl ×1