[英]php text encrypted with RSA in and base64 encoded doesnt remain some after decryption in android
我正在使用android创建密钥对,我使用http post使用php脚本将公钥发送到wamp服务器mysql数据库。
成功接收密钥后,PHP脚本使用密钥对字符串进行加密,并使用base43对其进行编码,代码片段将json对象回显到android .....在这里,我使用base64进行解码,然后使用私钥对文本进行解密并然后再次对其进行base64编码以进行查看。
的PHP
$rawKey = $_POST['rawKey'];
$publicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . chunk_split($rawKey) .
"-----END RSA PUBLIC KEY-----";
$rsa = new Crypt_RSA();
$rsa->loadKey($publicKey); // public key
$AESKeyString = "some text";
$AESKeyString = $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($AESKeyString);
$ciphertext = base64_encode($ciphertext);
$response = array('' => $ciphertext);
echo json_encode($response);
爪哇
public String Decrypt(String encryptedKey) {
Cipher cipher = null;
try {
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
cipher.init(Cipher.DECRYPT_MODE, privKey);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] cipherData = null;
try {
cipherData = cipher.doFinal(Base64.decode(encryptedKey, Base64.NO_WRAP));
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String cipherString = Base64.encodeToString(cipherData, Base64.NO_WRAP);
Log.d("SecCom", cipherString);
return cipherString;
}
问题是,尽管解密没有错误,但文本始终是垃圾。...但是,此垃圾是唯一的,并且对于给定纯文本也是相同的。...也就是说,java中的“ hello world”将始终转换为“ n; lk @; la”,而仅更改纯文本将更改解密的垃圾。
我看了许多关于stackoverflow的示例,这似乎对他们有用,并且纯粹出于某种直觉,我在加密之前在PHP字符串中添加了base64解码
$AESKeyString = base64_decode("some text");
和中提琴这解决了问题,除了现在我在Java中得到原始字符串之外,除了所有空格都被删除了.....,最后一个字符替换为g ==
那是“一些文本”显示为“ sometexg ==“
我已经尝试了许多文本,但是在所有空格和最后一个字符都被g ==取代的情况下这是恒定的
在我最终的php脚本中,我将为es生成随机字节,将其加密,然后编码以发送给java。 请在您提供给我的解决方案中牢记这一点.....
也为什么为什么在PHP中添加base64.decode对我来说是必要的,但对于其他人来说,它开箱即用
谢谢
正如我在评论中提到的...。我的问题是不了解字符串和编码部分以及它如何转换为java .....
好吧,我试了一下,做了一些阅读,重新编写了php端,并且在第一次尝试中就起作用了.....
....这是一个完整的工作php代码.... java代码不需要更改....我也对此进行了评论
php //获取发布的公钥$ pumpumString = $ _POST ['pumpum'];
//format public key in CRYPT format
$publicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . chunk_split($pumpumString) .
"-----END RSA PUBLIC KEY-----";
//initialise Algorithm
$rsa = new Crypt_RSA();
$rsa->loadKey($publicKey); // public key
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
//generate new AES Session Key
$AESKey = rand_sha1(32); //a custom created function
$AESKeyDecoded = base64_decode($AESKey);
//encrypt AES Session Key
$ciphertext = $rsa->encrypt($AESKeyDecoded);
//base 64 encode it for transfer over internet
$ciphertextEncoded = base64_encode($ciphertext);
//prepare array for sending to client
$response = array('plum' => $ciphertextEncoded);
//write the encoded and decoded AES Session Key to file for comparison
$file = fopen('key.txt', 'w');
fwrite($file, "\n". $AESKey);
//echo JSON
echo json_encode($response);
早些令我困惑的一件事就是为什么我需要在加密之前需要对base64进行纯文本解码。...嗯,我能够弄清楚的是,php可能使用ASCII来存储字符串。 因为在Java中,我正在使用base64_encode从解密的字节数组中获取解密的字符串.....我需要先对我的ascii纯文本字符串进行解码才能在java中重新生成它......(我可能说过a有点不连贯...请随时改写它。)
如果您认为我得出了错误的结论或可以改善的地方,请告诉我,我将其标记为已解决。
我也问过一种生成随机aes密钥的方法.....下面是我用来做的功能.....礼貌https://stackoverflow.com/a/637322/2208279
的PHP
function rand_sha1($length) {
$max = ceil($length / 40);
$random = '';
for ($i = 0; $i < $max; $i ++) {
$random .= sha1(microtime(true).mt_rand(10000,90000));
}
return substr($random, 0, $length);
}
我正在使用aes256,所以我已经使用32作为此函数的参数....将其修改为16表示128
谢谢....希望这可以帮助某人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.