Tag: rsa

RSA私钥仅支持RSAPrivate(Crt)KeySpec和PKCS8EncodedKeySpec

我按照链接中的步骤操作: 如何读取.pem文件以获取私钥和​​公钥 。 我执行了以下三个命令: 1. $openssl genrsa -out mykey.pem 2048 2. $openssl pkcs8 -topk8 -inform PEM -outform PEM -in mykey.pem -out private_key.pem -nocrypt 3. $ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der 这创建了三个文件,但是当我尝试通过Java代码读取这些文件时,我开始面临以下错误: PUBLIC KEY EXPO : 65537 Only RSAPrivate(Crt)KeySpec and PKCS8EncodedKeySpec supported for RSA private keys 我的代码供参考: public class PublicPrivateKeyDemo { private […]

使用java安全提供程序单独摘要和签名

由于一些实现细节,我需要拆分散列和签名生成。 我尝试使用’NONEwithRSA’签名算法来实现这一点。 这是一个基本的工作示例: public void rsaSignatureIntegrityTest() { KeyPairGenerator gen = KeyPairGenerator.getInstance(“RSA”); gen.initialize(2048, new SecureRandom()); KeyPair pair = gen.generateKeyPair(); byte[] digest = MessageDigest.getInstance(“SHA-256”).digest(MESSAGE); Signature signer = Signature.getInstance(“NONEwithRSA”); signer.initSign(pair.getPrivate()); signer.update(digest); byte[] signed = signer.sign(); Signature verifier = Signature.getInstance(“SHA256withRSA”); verifier.initVerify(pair.getPublic()); verifier.update(MESSAGE); verifier.verify(signed); } 运行此命令, verifier.verify()方法将引发Signatureexception: java.security.SignatureException: Signature encoding error at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204) at java.security.Signature$Delegate.engineVerify(Signature.java:1219) at java.security.Signature.verify(Signature.java:652) at testing.rsaSignatureIntegrityTest(testing.java:38) … […]

RSA的加密数据长度非常大

我希望加密数据的长度与原始文本的长度相同,因为我必须遵守长度约束。 我正在使用BouncyCastle 。 这是生成密钥对的代码: KeyPairGenerator keyGen = KeyPairGenerator.getInstance(“RSA”); keyGen.initialize(512); KeyPair keypair = keyGen.genKeyPair(); PublicKey pub = keypair.getPublic(); byte[] pubs = pub.getEncoded(); 这是我的加密代码: Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1PADDING”); PublicKey pk = KeyFactory.getInstance(“RSA”).generatePublic(new X509EncodedKeySpec(pubs)); cipher.init(Cipher.ENCRYPT_MODE, pk); byte[] cipherBytes = cipher.doFinal(plainArray); 编码数据非常大,我可以做什么做小原始数据?

在C#中加密的数据长度为1个字节,无法在Java中解密

我有一个用Java编写的服务器,它将其RSA密钥转换为.NET使用的XML格式,然后再将其发送到客户端: public String getPublicKeyXML() { try { KeyFactory factory = KeyFactory.getInstance(“RSA”); RSAPublicKeySpec publicKey = factory.getKeySpec(this.keyPair.getPublic(), RSAPublicKeySpec.class); byte[] modulus = publicKey.getModulus().toByteArray(); byte[] exponent = publicKey.getPublicExponent().toByteArray(); String modulusStr = Base64.encodeBytes(modulus); String exponentStr = Base64.encodeBytes(exponent); String format = “” + “%s” + “%s” + “”; return String.format(format, modulusStr, exponentStr); } catch (Exception e) { this.server.logException(e); return “”; } […]

如何在Java中为现有私钥添加密码

假设我使用openssl创建了以前创建的私钥,但我决定不使用密码来保护它: —–BEGIN RSA PRIVATE KEY—– BASE64 ENCODED DATA —–END RSA PRIVATE KEY—– 但后来我意识到我想保护它。 我知道如何使用openssl保护它,但我需要用Java来实现它。 可能吗 ?

RSA和Base64编码太多字节

我正在尝试使用Base64编码实现RSA加密。 顺序是: String -> RSA encrypt -> Base64 encoder -> network -> Base64 decoder* -> RSA decrypt > String 我将通过网络发送base64编码的字符串,并在所有Base64为文本之后将其作为字符串读取,对吧? 现在有些原因当我解码Base64时,我得到的字节数比我最初发送的字节数多。 在发送方,我的RSA字符串是512字节。 在Base64编码后,其长度为1248(每次都会变化)。 在接收器端,我的Base64编码接收字符串仍然是1248长,但当我解码它然后我突然得到936字节。 然后我无法使用RSA解密它,因为ciper.doFinal方法挂起。 我假设这有一些东西与字节到unicode字符串转换但我无法弄清楚这发生在哪一步以及我如何解决它。 发件人边码: cipher = Cipher.getInstance(“RSA/NONE/OAEPWithSHA256AndMGF1Padding”); cipher.init(Cipher.ENCRYPT_MODE, getPublicKey()); byte[] base64byes = loginMessage.getBytes(); byte[] cipherData = cipher.doFinal(base64byes); System.out.println(“RSA: ” + cipherData.length); //is 512 long //4. Send to scheduler Base64PrintWriter base64encoder = new […]

javax.crypto.Cipher为RSA使用了哪个填充

我需要通过RSA解密消息,以便通过不安全的通道发送消息,但我害怕Padding Oracle Attack 。 因此我已经问过以下问题: 如何validationRSA加密消息的完整性? 如何使用javax.crypto.Cipher确保RSA密码的消息完整性 像第一个问题中建议的那样, 但是,由于您使用的是高级加密库,因此您不必担心这一点。 该图书馆的作者应该照顾它。 我不应该考虑。 据我所知, PKCS#1 v1.5的RSA实现容易受到Padding Oracale Attack ,因此OAEP不是(假设它已正确实现) 因此,我想知道Java 7的javax.crypt.Cipher使用了哪个填充实现

使用Phpseclib在Java中加密并在PHP中解密

编辑2:问题已经解决。 我不明白php中的loadkey函数应该如何工作,我错误地认为它会读取一个密钥文件(它没有)。 解决方案是将文件的内容读入变量,然后使用loadkey加载变量。 编辑:问题似乎与关键。 我意识到loadkey返回false,表明它无法读取密钥。 phpseclib接受的格式和java中创建的密钥有什么不同吗? 我试图加密Java(android)中的AES密钥并在PHP中解密它以使用对称加密进行数据传输。 目前,我能够使用Java中的RSA加密和解密短文件或字符串,但无法在PHP中解密它。 我使用phpseclib在PHP中解密,我没有得到任何错误,但我的输出字符串为空。 这是我正在使用的代码: Java的: File archivo_llave_publica = new File(direccion); byte[] bytes_llave = leer(archivo_llave_publica); KeyFactory keyFactory = KeyFactory.getInstance(“RSA”); EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(bytes_llave); PublicKey pubKey = keyFactory.generatePublic(publicKeySpec); Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] cipherData = cipher.doFinal(src); return cipherData; PHP: setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->loadKey(‘./key/Pri.txt’); // public key $temprsa = $rsa->decrypt($key); if […]

使用PEM PrivateKey签名字符串

我有一个PEM编码的私钥,我需要用它来签名一个字符串。 但代码不断崩溃,但exception: java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG 关键字符串: —–BEGIN ENCRYPTED PRIVATE KEY—– MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI4P/+9mJV6RwCAggA MBQGCCqGSIb3DQMHBAg/ZWGXeLHgeASCAoAhExhFxfcikmIKbFP0rgAlJuj1r999 … and so on… hlgzM2p71FdC6NDVyyxbit/IzbimtJyhkRwOAnZ98yqtXWUEOx2v7CcUqiU8dSLA K0PsaxNTUeUcQV+Z7yJk/8HxfE1ya3u2CgPXCZsWWmbxQG/+awE0eEnZ —–END ENCRYPTED PRIVATE KEY—– 我尝试了很多变种,看了很多答案,但结果是一样的 编辑:在James K Polk的帮助下,我设法得到私钥字节,但现在我得到java.security.NoSuchAlgorithmException: SecretKeyFactory PBES2 implementation not found. 修改后的代码 private String sign(String dataString, String pkString, String privateKeyPass) throws Exception { pkString = pkString.replace(“—–BEGIN ENCRYPTED PRIVATE KEY—–“, “”); pkString = pkString.replace(“—–END […]

Java安全类强制转换exception

嗨,我是Java安全的初学者,我在调用时遇到以下问题: Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); 我收到了错误: java.lang.ClassCastException: com.sun.crypto.provider.RSACipher cannot be cast to javax.crypto.CipherSpi 在我的war文件中还有5个用于支付网关加密的jar文件: CRYPTIX-JCE-api.jar文件 CRYPTIX-JCE-provider.jar CRYPTIX-消息api.jar文件 CRYPTIX-的OpenPGP-provider.jar CRYPTIX-PKI-api.jar文件 如果没有这5个JAR文件,那么Cipher.getInstance()可以工作,但这是不可能的,因为我需要JAR来进行支付信息加密。 那里的任何人都可以告诉我如何克服这个问题的道路?