Tag: rsa

RSA Cipher的线程安全性

正如标题所说,我想知道在给定RSA算法的情况下如何在multithreading环境中最好地使用Cipher实例。 我已经阅读了关于这个主题的几个问题,以及我收集的内容: 密码不是线程安全的,因为它在加密/解密时保持内部状态 如果使用AES,则doFinal()会将初始化向量重置为上一个已知值,因此每次都应生成新的Cipher实例 我的问题 如果选择的算法是RSA,是否只能调用一次cipher.init() ? 这与第二个子弹相反,如下面的代码所示。 我相信因为没有初始化向量。 此外,密码仅用于解密数据。 我应该只在cipher.doFinal()调用上同步吗? 处理多个线程请求加密服务的常用方法是什么,我应该将密码池作为一些代理后面的阻塞队列吗? 代码示例: public class RsaPrototype { private static PrivateKey privKey; private static Cipher cipher; private static final String PRIVATE_KEY_PATH =”./privK.pem”; /* * ALGORITHM/BLOCKING_MODE/PADDING_SCHEMA */ private static final String CIPHER_SPECIFICATION = “RSA/None/NoPadding”; private static final String RSA_PROVIDER =”BC”; static { Security.addProvider(new BouncyCastleProvider()); importPrivateKey(); cipher = […]

java.security.NoSuchAlgorithmException:RSA签名不可用

这是例外 线程“main”中的exceptionjava.security.NoSuchAlgorithmException:RSA签名不可用 在java.security.Signature.getInstance(Signature.java:229) 在MailClient.main(MailClient.java:52) 这是我的代码 import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.util.*; import java.security.*; public class MailClient { public String getMessage(Mail m){ return m.message; } public static void main(String[] args) throws Exception { // Initialisation BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String host = args[0]; int port = Integer.parseInt(args[1]); String userid = args[2]; while(true) […]

如何使RSACryptoServiceProvider无需填充(nopadding)?

我需要使C#应用程序与Java应用程序兼容。 Java应用程序使用Cipher.getInstance(“RSA/ECB/nopadding”); 初始化程序,使密码ECB和无填充。 但是,在C#中,您有2个填充选项:OAEP填充或PKCS#1 v1.5填充。 我需要一个无填充版本,否则我肯定会陷入我的项目中。 我认为没有办法让C#.NET RSACryptoServiceProvider使用无填充方案。 但是,是否存在允许此精度的RSA自定义类或库? PS:默认情况下是C#.NET的RSACryptoServiceProvider ECB吗? 我找不到关于此的文档。

PKCS#1 V2.0是否针对Java实现?

我需要使用PKCS#1 V2.0加密方法(在PKCS#1V2规范的第 7.2.1节中定义)加密数据。 它已经为Java实现了吗? 我正在考虑将一个参数传递给javax.crypto.Cipher指定“PKCS#1V2”,我想知道是否有这样的东西?

在PHP和Java Android问题之间使用RSA解密数据

我使用PHP服务器加密一些数据,然后将其解密到Android设备。 但是当我尝试在Android设备端解密时,我收到以下错误: javax.crypto.BadPaddingException:错误:0407106B:rsa例程:RSA_padding_check_PKCS1_type_2:块类型不是02 当我在 Cipher.getInstance(“RSA/ECB/PKCS1Padding”); 我正在使用PHPSeclips库(此日期的最后一个github版本)加密PHP服务器上的值并签名。 这部分确实有效,因为已经习惯在Javacard程序上解码,所以错误实际上并不属于这里。 这是我在Android方面的方式: protected byte[] decryptData(String alias, byte[] data) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, UnsupportedOperationException { Log.i(TAG, “decryptData() Decrypt data ” + HexStringConverter.byteArrayToHexString(data)); byte[] decryptedData = null; PrivateKey privateKey = getPrivateKey(alias); Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); cipher.init(Cipher.DECRYPT_MODE, privateKey); decryptedData = cipher.doFinal(data); Log.i(TAG, “decryptData() Decrypted data: ” + HexStringConverter.byteArrayToHexString(decryptedData)); return […]

Java Android错误“RSA块的数据太多”

A在我的Android项目中有错误(RSA加密/解密)。 加密通过OK,但是当我尝试解密加密文本时,有一个错误: “RSA块的数据太多” 。 如何解决这个问题呢? 码: public String Decrypt(String text) throws Exception { try{ Log.i(“Crypto.java:Decrypt”, text); RSAPrivateKey privateKey = (RSAPrivateKey)kp.getPrivate(); Cipher cipher = Cipher.getInstance(“RSA/ECB/NoPadding”); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] cipherData = cipher.doFinal(text.getBytes());// <—-ERROR: too much data for RSA block byte[] decryptedBytes = cipher.doFinal(cipherData); String decrypted = new String(decryptedBytes); Log.i("Decrypted", decrypted); return decrypted; }catch(Exception e){ System.out.println(e.getMessage()); } return […]

JAVA RSA解密无法正常工作,抛出InvalidKeySpecException

我使用phpseclib生成RSA公钥和私钥。 $rsa = new Crypt_RSA(); $rsa->setHash(‘sha1’); $rsa->setMGFHash(‘sha1’); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); extract($rsa->createKey(2048)); 然后我在我的Android应用程序中使用这两个键来加密/解密数据。 public static final String publicKey = “MIIBIjANBgk……DAQAB”; public static final String privateKey = “MIIEpAI……Zh+0bQ==”; 我可以使用公钥加密JAVA中的数据,并使用私钥在PHP中解密该数据。 这工作正常, public static String encryptData(String data) { String ret = null; try { PublicKey key = KeyFactory.getInstance(“RSA”).generatePublic( new X509EncodedKeySpec(Base64.decode(publicKey, Base64.DEFAULT))); Cipher cph = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); cph.init(Cipher.ENCRYPT_MODE, key); ret = […]

从Java中的已知参数创建RSA密钥

我正在努力实施Bing Cashback。 为了validation来自Bing的传入请求是有效的,他们提供签名。 签名是使用RSA加密的URL的160位SHA-1哈希。 Microsoft提供了RSA“公钥”,模数和指数,我应该用它来解密哈希。 有没有办法创建解密哈希所需的Java密钥对象,正如微软所说的那样? 我能找到的所有东西都会自动创建RSA密钥对,因为这就是RSA应该如何工作的。 如果可能的话,我真的很想使用Java对象,因为这显然比手动编码解决方案更可靠。 他们提供的示例代码是在.NET中,并使用.NET库函数来validation哈希。 特别是RSACryptoServiceProvider.VerifyHash()

RSA加密 – 解密:BadPaddingException:数据必须从零开始

我很遗憾地问你关于这么多问题的技巧。 我有一个关于RSA crypthography的问题。 我已经检查了有关此问题的其他主题,但我没有找到任何有用的答案。 我希望你能帮助我。 我想读取一个文件,将其包含,然后解密并将这些解密的字节放在一个新文件中。 我实际上可以: – 获取文件的字节 – 加密它 我有一个例外:javax.crypto.BadPaddingException:数据必须从零开始。 这是我的代码: package com.bodom.ghosty; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.io.*; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; import java.util.Scanner; public class EncryptionUtil { private final PrivateKey privateKey; […]

Java中的RSA BadPaddingException – 在JRE中解密Android中的解密

我发现了一些其他的问题,但我没有找到解释是什么导致这个问题。 我在Java中编写了一个函数来加密数据,将其存储到一个文件中并解密它再次加载文件。 由于它是非对称加密,因此我有一个公钥和私钥,它直接存储在代码中以便进行测试。 问题似乎是加密本身的差异,因为该function适用​​于Android以及安装了Java RE 7的Windows机器上。 但是不可能使用相同的密钥和function来加密来自JRE7系统上的Android的数据,结果是“糟糕的填充执行”。 出于测试目的,我只使用一个数据块。 由于en / decrypt在每个系统中都有效,我确信问题不是关键。 最终版本将对二进制数据进行编码和解码 – 所以我只使用字节而不必担心字符串中的不同字符集。 在我理解了原因之后,我将使用pureRSA解码PHP中的数据。 import java.io.DataInputStream; import java.io.FileInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import android.util.Base64; import java.math.BigInteger; import java.security.InvalidAlgorithmParameterException; import javax.crypto.Cipher; import java.security.KeyFactory; import java.security.spec.RSAPublicKeySpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.spec.InvalidKeySpecException; import javax.crypto.NoSuchPaddingException; import java.security.InvalidKeyException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.BadPaddingException; […]