Java 在android中解密后,使用RSA加密和base64编码的php文本不会保留一些
我使用android创建密钥对,我使用http post使用php脚本将公钥发送到wamp服务器mysql数据库 成功接收密钥后,php脚本使用密钥对字符串进行加密并使用base43对其进行编码,sripts将json对象回送到android…在android中,我使用base64解码,然后使用私钥解密文本,然后再次对其进行base64编码以查看它 php 爪哇 问题是,尽管解密过程中没有错误,但文本始终是垃圾……然而,对于给定的明文来说,这种垃圾是唯一的,也是相同的……也就是说,java中的“hello world”总是会转换为“n;lk@;la”,只有更改明文才会更改解密的垃圾 我看了很多关于stackoverflow的例子,这似乎对他们有用,纯粹是出于直觉,我在加密php字符串之前添加了base64解码Java 在android中解密后,使用RSA加密和base64编码的php文本不会保留一些,java,android,encryption,rsa,phpseclib,Java,Android,Encryption,Rsa,Phpseclib,我使用android创建密钥对,我使用http post使用php脚本将公钥发送到wamp服务器mysql数据库 成功接收密钥后,php脚本使用密钥对字符串进行加密并使用base43对其进行编码,sripts将json对象回送到android…在android中,我使用base64解码,然后使用私钥解密文本,然后再次对其进行base64编码以查看它 php 爪哇 问题是,尽管解密过程中没有错误,但文本始终是垃圾……然而,对于给定的明文来说,这种垃圾是唯一的,也是相同的……也就是说,java中的“
$AESKeyString = base64_decode("some text");
viola解决了这个问题,除了现在我得到了java中的原始字符串,除了所有的空格都被删除了。。。。。最后一个字符被g替换==
即“某些文本”显示为“sometex==”
我试过许多文本,但这是不变的,没有空格,最后一个字符被g替换==
在我的最后一个php脚本中,我将为aes生成随机字节,对它们进行加密,然后对它们进行编码以发送到java。请在您提供给我的解决方案中牢记这一点
另外,为什么在php中添加base64.decode对我来说是必要的,而对其他人来说,它只是开箱即用
正如我在评论中提到的那样,谢谢。。。。我的问题是不理解字符串和编码部分以及它如何转换为java 我尝试了一下,读了一点,重写了php方面的内容,在第一次尝试中就成功了 。。。。这是一个完整的php代码…java代码不需要更改…我也对其进行了注释 php //获取发布的公钥 $PumpString=$_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_编码从解密的字节数组中获取解密的字符串……我需要首先解码我的ascii明文字符串,以在java中重新生成它……(我可能用了一些不连贯的措词……请随意重写它。)
如果你觉得我得出了错误的结论,或者有些事情可以改进,请让我知道,我将此标记为已解决
此外,我还要求提供一种生成随机aes密钥的方法……下面是我用于生成该密钥的函数……出于礼貌
php
函数rand_sha1($length){
$max=ceil(长度/40美元);
$random='';
对于($i=0;$i<$max;$i++){
$random.=sha1(微时间(真)。百万兰特(100009000));
}
返回substr($random,0,$length);
}
我使用的是aes256,所以我使用32作为该函数的参数……将其修改为16表示128
谢谢……希望这能帮助到别人。尝试随机的东西不会有任何结果。快,alee,尝试并学习如何使用加密。PHP非常宽容,因为它几乎可以接受任何东西作为密钥。。但是AES密钥应该由16、24或32个随机字节组成。尝试并以字节形式查看密码实例的所有输入。我正在为AES密钥生成随机字节(我正在成功生成)然后尝试将它们转换为字符串…实际上,经过大量阅读,我开始认为我的问题在于不理解加密…这是字符串和十万标准…utf unicode ascii base64…编码解码…在php代码中…我将未加密的密钥写入文件只是为了在android中检查生成的密钥是。。。。一旦确定关键在于java和php之间的无缝转换,就可以将其注释掉。。。。或者,如果需要,也可以使用标准安全实践将密钥存储在mysql中
$AESKeyString = base64_decode("some text");
//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);
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);
}