标签: jce

我应该使用Cipher.WRAP_MODE或Cipher.ENCRYPT_MODE来加密会话密钥吗?

如何使用从服务器端传输的公钥加密客户端的会话密钥?

我应该使用Cipher.WRAP_MODECipher.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.有人可以帮我吗?

java encryption jce

6
推荐指数
1
解决办法
8338
查看次数

AES-256和PKCS7Padding在Java中失败

我有几个库,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 encryption jce aes pkcs#7

6
推荐指数
1
解决办法
2万
查看次数

带有 PKCS#5 填充的 AES

在很多地方,我看到 Java 代码使用 AES 和 PKCS#5 填充。我不明白这怎么可能行得通。

PKCS#5 填充旨在与块大小 <= 8 字节的密码一起使用。AES 的块大小为 16 字节。所有使用 AES 和 PKCS#5 的代码都是错误的吗?或者框架内部是否使用 PKCS#7 来代替?所讨论的框架是 Sun 提供的 Java、JCE 和 BouncyCastle。

java encryption bouncycastle jce aes

6
推荐指数
1
解决办法
1609
查看次数

哪个提供商负责AES / CTR / NoPadding?

有关我的实施的信息

下面的代码片段突出显示了我当前使用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)

java cryptography jce aes ctr-mode

6
推荐指数
1
解决办法
1971
查看次数

Bouncy Castle vs Java默认RSA与OAEP

有人可以向我解释为什么这个代码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)

java encryption rsa bouncycastle jce

6
推荐指数
1
解决办法
3461
查看次数

在 Android 上使用哪个 JCE 提供程序?充气城堡、Conscrypt……?

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\n
static {\n    try {\n        Security.insertProviderAt(Conscrypt.newProvider(), 1);\n\n    } catch (NoClassDefFoundError e) {\n        e.printStackTrace();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我遇到以下崩溃:

\n\n

java.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 …

java android bouncycastle jce boringssl

6
推荐指数
1
解决办法
3731
查看次数

在Eclipse安装期间验证JCE证书

在Eclipse的安装过程中(使用Eclipse Installer),我被问到“您信任这些证书吗?”,其中列出了Bouncy Castle的两个证书(一个由Sun签名,一个由Oracle签名)和一个Eclipse的证书(由Sun签名)。如何验证这些证书?

证书对话框的屏幕截图

我了解这是JCE(Java密码学扩展)的代码签名证书,即Oracle签署的用于加密,密钥生成和密钥协议以及消息身份验证代码(MAC)算法的证书。我也知道Bouncy Castle通常用于提供与加密有关的算法。

两个问题:

  1. 所有证书都由相同的两个CA签名,但是我找不到“官方” CA证书指纹的(公共)列表。我如何验证这些?
    • Sun Microsystems Inc颁发给JCE的JCE代码签名CA,有效期至2020-04-25,指纹57:37:D1:E1:16:2F:F6:FE:26:B9:87:88:D2:86: DA:66:7F:98:54:3C
    • Oracle Corporation颁发给Oracle Corporation的JCE代码签名CA,有效期至2030-12-31,指纹F4:B9:C6:4A:52:AD:22:3C:E4:BF:BA:52:52:87:9C :9F:71:1D:4B:33
  2. 为什么默认情况下不信任那些CA,即这些CA包含在JDK / JRE随附的某些信任存储中?CA由Oracle操作(至少CA证书这样说),我使用的JRE由Oracle提供(openjdk 11.0.2),我认为没有理由不信任CA(因为它们确实合法) 。

eclipse certificate jce

6
推荐指数
1
解决办法
285
查看次数

Jasypt CLI 错误 无法操作(错误的输入或参数)

我遇到了与命令行 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)

java jce jasypt

6
推荐指数
1
解决办法
2017
查看次数

在IBM AIX上定制JCE提供程序

我正在为客户端编写一个新的JCE Provider,因为我需要公开一些自定义Cipher.延长后CipherSpiProviderSpi,我准备再建.所以我问客户端他们定位的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提供程序来支持所需的功能(使用如何实现提供程序指南),从包中扩展ProviderSpiCipherSpi抽象类com.sun.*.我是否需要获取IBM Java JDK并从中扩展抽象类com.ibm.*?或者我可以使用我的Sun-rooted Java代码签名证书来签署我的JCE提供程序JAR,并将其直接放到AIX系统上的正确位置?(其中一个是愚蠢的,但我不知道哪个).

我对JCE/JVM风格知之甚少,不知道我现在是否需要一个基于IBM的Java代码签名证书(如果有的话),或者Sun-rooted签名是否足够?

java aix cryptography jce

5
推荐指数
1
解决办法
745
查看次数

SSL + Java 8 + OpenJDK + SNI + HTTPClient =握手失败

我有一些代码已经工作了很长时间,通过HTTP从webapps获取数据.它使用Apache HTTPClient(v.4.5.2),适用于有和没有SSL的站点.

最近,我试图使用if用于其他恰好使用SNI的网站.一切都在我的Windows机器上运行良好,但如果我尝试在AWS EC2 Linux实例上运行它,我会得到握手失败(因为SNI).

这是我正在运行的:

Windows Java

  • java版"1.8.0_101"
  • Java(TM)SE运行时环境(版本1.8.0_101-b13)
  • Java HotSpot(TM)客户端VM(版本25.101-b13,混合模式,共享)

AWS Linux Java

  • openjdk版本"1.8.0_91"
  • OpenJDK运行时环境(版本1.8.0_91-b14)
  • OpenJDK 64位服务器VM(内置25.91-b14,混合模式)

我不确定哪个组件最终导致失败(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)

java ssl jce amazon-web-services sni

5
推荐指数
1
解决办法
1015
查看次数