Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中解密后,使用RSA加密和base64编码的php文本不会保留一些_Java_Android_Encryption_Rsa_Phpseclib - Fatal编程技术网

Java 在android中解密后,使用RSA加密和base64编码的php文本不会保留一些

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中的“

我使用android创建密钥对,我使用http post使用php脚本将公钥发送到wamp服务器mysql数据库

成功接收密钥后,php脚本使用密钥对字符串进行加密并使用base43对其进行编码,sripts将json对象回送到android…在android中,我使用base64解码,然后使用私钥解密文本,然后再次对其进行base64编码以查看它

php

爪哇

问题是,尽管解密过程中没有错误,但文本始终是垃圾……然而,对于给定的明文来说,这种垃圾是唯一的,也是相同的……也就是说,java中的“hello world”总是会转换为“n;lk@;la”,只有更改明文才会更改解密的垃圾

我看了很多关于stackoverflow的例子,这似乎对他们有用,纯粹是出于直觉,我在加密php字符串之前添加了base64解码

$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);
}