问题标签 [javax.crypto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
872 浏览

android - Android 和 Crypto++ AES 128 位加密结果不匹配

我正在尝试使用相同的密钥和 VI 来加密和解密相同的消息,例如aabbcc@gmail.com. 密钥长度为 128 位,因为我知道在 Java/Android 中,256 不容易实现。

这是我使用 Crypto++ 进行 AES 加密的功能

键是“4ff539a893fed04840749287bb3e4152”,IV 是“79f564e83be16711759ac7c730072bd0”。

它们以二进制形式存储在 x86 Windows 上的 VMWare 中运行的 ubuntu 中。

将字节数组转换为十六进制数组的函数keyiv

我检查了十六进制字符串与字节数组key和的内存iv,它们是匹配的。

加密的结果aabbcc@gmail.com来自c08a50b45ff16650542e290e05390a6c6fe533e11e9f802ad7d47681fd41f964C++。

我通过将返回的字符串传递给函数ciphertext来获得这个hexToStrcout<<TFFHelper::hexStr((unsigned char *)ciphertext.c_str(), ciphertext.length())<<endl;

我也可以使用以下函数对其进行解密,并将原始字符串而不是十六进制字符串传递给该函数。


我将相同的 VI 和 KEY 放入我的 Android 代码中,并尝试加密。它在加密后最终得到一半匹配的结果。

安卓代码如下:

我得到了结果C08A50B45FF16650542E290E05390A6CFE5466FC480F0667517B248410930B69

我在 Java8 上的 Netbeans 中使用了相同的代码,在与 C++ 代码相同的 Ubuntu 上运行,得到的结果与我在上一行中提到的完全相同(Android 结果)。我不认为这是依赖于操作系统的,但我的代码中的 Java 或 C++ 可能有问题。

所以十六进制字符串的前半部分匹配,后半部分不匹配。我试图将短语简化aabbcc@gmail.comabc@gmail.com,这导致 C++ 与 Java(Ubuntu 与 Android)的结果完全不同。

但是,如果我在 Java 中解密该二进制数组,我会得到原始短语aabbcc@gmail.comor abc@gmail.com

我有以下问题。

  1. 我做错了什么?
  2. 这是正确的案例const char *unsigned char *?我认为应该没问题,因为我正在获取二进制的十六进制字符串
  3. 半匹配结果是填充造成的吗?
0 投票
2 回答
245 浏览

java - Liferay 7 与 IBM Java javax.crypto 错误

尝试使用 IBM Java 8 在 z、SLES12 上运行 Liferay 7 包。运行 startup.sh 时出现以下错误:

爪哇版:

我似乎无法清除

找不到所需的扩展 [javax.crypto]

错误,我想知道是否有人知道:

  1. IBM Java 与 Liferay 7 兼容
  2. 有一种方法可以使用 Oracle Java 安全包代替 IBM 的

如果有人有任何关于我如何在当前环境中启动和运行 Liferay 7 的信息,将不胜感激。

0 投票
1 回答
156 浏览

java - com.google.gson.Gson 类因 javax.crypto.SecretKey 而失败?

我已经SecretKey在一些加密操作期间存储了我以后需要使用的。在存储时,我将其转换为字符串:

但是在检索以下代码时失败:

此外,即使使用 Verbose 消息过滤器,我也没有在 LogCat 中获得任何单一提示。我尝试在 try catch 中使用调试点包围代码(希望在调试时可以得到任何异常跟踪):

但是调试器不会在两个调试点停止,立即在设备应用程序崩溃并显示不幸的应用程序崩溃消息。

save for 的 json 结构SecretKey如下:

注意:integer1、integer2 ... 是出于安全目的的实际数字我没有发布原始结果数字。

可能出了什么问题?这样的存储SecretKey是不允许的吗?

更新

使用 Gson 将 SecretKey 转换为 json 字符串,反之亦然是一个坏主意,正如下面 jonathanrz 所回答的那样,我遵循了他的回答并在 android 中编写了两个实用函数来将 SecretKey 转换为字符串,反之亦然函数如下:

0 投票
2 回答
485 浏览

java - javax.crypto.BadPaddingException:给定最终块未正确填充

我将 Triple DES 用于我的加密/解密目的,但不知何故它给了我上述异常,我尝试了相关答案中提到的其他方法,但我被卡住了。我是密码学和相应的 java 库的新手。

编辑:

最后通过解决方案,我只是放错了组件,也指定了核心逻辑。

0 投票
0 回答
101 浏览

java - 为会话信息生成 DES 密钥时出错。原因:没有这样的提供者:CryptixCrypto

将 Maven 项目从 Java 7 升级到 Java 8 后,出现以下错误:

Error generate DES key for session info. Cause: no such provider: CryptixCrypto

可以通过将以下行添加到代码的适当位置来解决该问题:

谁能解释一下会发生什么以及这个问题的最佳解决方案是什么?

0 投票
0 回答
499 浏览

java - 将节点 js Crypto.publicEncrypt 移植到 Java

我在 Node.js 中有以下代码

我也有测试用例来确定代码是否已正确加密(虽然我不能分享这些)我想在 Java 中有等效的加密代码。我已经引用了一些其他的 stackoverflow 问题,例如字符串加密工作,字节 [] 数组类型的加密在生成密钥的地方不起作用 。这对我不起作用,因为我需要能够设置公钥的字符串。将节点“加密”代码移植到 Java对我不起作用,因为我不相信我需要密码并且节点 js 代码不包含密码,使用 Node.js 加密模块加密并使用 Java 解密(在 Android 应用程序中)确实对我不起作用,因为我无法设置公钥的加密字符串,并且节点 js 加密中等效的 java 加密方法不起作用,因为我的节点 js 代码不包含密码。我还在 java 中引用了这段代码:

但是,当我简单地插入公钥字符串时,我没有得到正确的加密。我也不确定如何在 Node js 中实现填充以及 crypto.publicencrypt 的默认加密算法是什么。

任何帮助,将不胜感激。

0 投票
1 回答
1360 浏览

ssl - ssl 和 StandardPBEStringEncryptor 的 PowerMock 问题

试图运行 Junit 测试

  1. 下面是使用org.jasypt.encryption.pbe.StandardPBEStringEncryptor的密码解密
  1. TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
  1. 当我在 Junit 上尝试使用 @PowerMockIgnore ("javax.crypto. , javax.net.ssl. ") 时,它仍然因上述密码解密问题而失败
  2. 当我在 Junit 上使用一个 @PowerMockIgnore ("javax.crypto.*") 时,它会因 Loading jks 问题而失败

有什么办法可以解决这类问题

0 投票
1 回答
453 浏览

java - 一个大文件的hmac MD5

我正在使用用 BufferedInputStream 包装的 FileInputStream 来读取字节块中的大文件。

它对于一个小文件非常有效,但对于一个 200MB 的文件来说需要大量的时间。

当我尝试使用 SHA256withRSA 对 200MB 文件进行签名时,同样的方法效果很好。

这有什么具体原因吗??我觉得这与md.update() 有关。

但是我在使用“签名”时也使用了相同的功能。

任何帮助,将不胜感激。

0 投票
1 回答
1534 浏览

javascript - 在 Java 中从 crypto-js 库中实现加密功能

javascript 开发人员使用crypto-js来加密文本。它使用简单。

在此示例中,加密函数仅采用两个参数 messageToEncrypt 和 salt。其余配置将在其定义中。我不是 javascript 人,所以很难找到和理解加密定义。

我想AES使用 java 实现相同的加密。因此,对于相同的输入参数,例如 messageToEncrypt 和 salt,我应该使用 crypto-js 库和 Java 实现获得相同的加密文本。

我尝试javax.crypto探索谷歌上的一些链接。

但这对我不起作用,因为我不知道 keySize 和迭代计数等确切参数。

我也尝试使用https://github.com/mpetersen/aes-example/blob/master/src/main/java/org/cloudme/sample/aes/AesUtil.java但我也不确定 keySize 和 iterationCount .

如何在java中创建crypto-js的AES加密的简单精确实现?

0 投票
1 回答
585 浏览

java - 无法从密码输入流中反序列化密封对象

当我从 CipherInputStream 读取对象时,为什么会收到无效的流标头错误?(编辑:可能是由于重复使用 Cipher 对象?,下面包含的示例代码的新版本已经解决了这个问题。)

我的程序正在尝试从使用 CipherInputStream 作为源(来自文件)的 ObjectInputStream 中读取,即:

文件 -> 解密流 -> 反序列化 -> 对象

运行时错误是:

下面列出的示例程序中的 write 方法使用普通 FileOutputStreamCipherOutputStream 写入文件,因此我们有 2 个文件要检查。read 方法同样尝试读取这两个文件。纯文件的写入和读取没有问题,但是加密文件会引发异常。如果您查看纯文件的前 8 个字节,您可以看到它们是:

其中“ac ed 00 05”对应于 ObjectStream Magic 和版本(即标题):https ://docs.oracle.com/javase/8/docs/platform/serialization/spec/protocol.html

但是异常报告的“损坏”标头对应于标头之后的四个字节:73 72 00 19!

在我看来,CipherInputStream 正在正确解密流,但消耗或跳过标头本身并从字节 5 开始传送数据。

这是错误的输出:

这是代码:

编辑:我重新调整了代码,以便我对流和 Seal 操作使用不同的 Cipher 对象:x.sealdob 和 x.iostream

修改后的代码现在可以正常运行,两个文件都被写入和读取,没有错误:

这是新的(好的)输出:

这是更新的代码(有效):