Tag: phpseclib

如何RSAvalidation在php中生成的java中的签名

我们使用phpseclib进行公钥签名,android java用于公钥validation。 但它重复失败了。 PHP代码用于生成密钥和通过私钥签名 include_once(“phpseclib/autoload.php”); function getKeys($keysize=2048){ $rsa = new Crypt_RSA(); //$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); //$rsa->setPublicKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); $d = $rsa->createKey($keysize); return array(“publickey”=>$d[‘publickey’], “privatekey”=>$d[‘privatekey’]); } function encryptdata($message, $encryptionKey){ $rsa = new Crypt_RSA(); //$rsa->setPublicKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); //$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); $rsa->loadKey($encryptionKey); // public key return $rsa->encrypt($message); } function decryptdata($message, $decryptionKey){ $rsa = new Crypt_RSA(); // $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); // $rsa->setPublicKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); $rsa->loadKey($decryptionKey); // […]

使用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 […]

在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 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加密,PHP中的解密

我正在尝试使用RSA公钥和Android应用程序加密AES密钥,然后使用带有phpseclib的PHP在服务器上解密AES密钥。 我已经测试过确保RSA加密/解密在两个平台上都可以通过加密静态文本并在之后解密来检查我是否仍然获得原始文本。 根据测试,RSA代码在每个平台上单独工作,但平台之间似乎存在差异。 在Java中,我使用的是Bouncy Castle库并具有以下代码: RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec( new BigInteger(“00c897f9e401819e223ffbecc6f715a8d84dce9022762e0e2d54fa434787fcaf230d28bd0c3b6b39b5211f74ffc4871c421362ccfc07ae98b88fa9728f1e26b8210ebbf4981e45867fe810938294d0095d341b646b86dcbd4c246676c203cb1584d01eef0635299714d94fa12933ecd35e6c412573156d9e6e549b7804eb6e165660507d8748bcc8c60da10099bacb94d3f7b50b1883ee108489e0dd97ed7d28e564edd4ee5d6b4225f5c23cdaaf495c3fa08c3b82e1674946e4fa1e79b2493204d6953c261105ba5d0f8dcf3fcd39a51fbc18a5f58ffff169b1bed7ceeded2ae0e8e8e2238e8b77b324d1a482593b1a642e688c860e90d5a3de8515caf384133b”, 16), new BigInteger(“11”, 16)); keyFactory = KeyFactory.getInstance(“RSA”, “BC”); //RSAPublicKeySpec rsaKeySpec = new RSAPublicKeySpec(rsaKey.MODULUS, new BigInteger(“11”, 16)); RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec); //Set up the cipher to RSA encryption Cipher cipher = Cipher.getInstance(“RSA/None/PKCS1Padding”, “BC”); cipher.init(Cipher.ENCRYPT_MODE, pubKey); // make sure the Aes Key is less than […]

在PHP中使用RSA的MD5

我正在尝试在php中实现数字签名,如下面的java示例代码: Signature rsaSig = Signature.getInstance(“MD5withRSA”); RSAPrivateKey clientPrivateKey = readPrivateKeyFromFile(fileName); rsaSig.initSign(clientPrivateKey); String source = msg; byte temp[] = source.getBytes(); rsaSig.update(temp); byte sig[] = rsaSig.sign(); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(sig); 我的PHP代码: $rsa = new Crypt_RSA(); $rsa->loadKey(‘…’); // in xml format $plaintext = ‘…’; $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); $signature = $rsa->sign($plaintext); 但看起来有些东西不见了。 我们应该得到与java代码返回相同的签名。任何人都可以指导我吗?