rsa加密解密安卓
『壹』 Android中自帶的RSA加密演算法和java中的不是一個標準的嗎
有點區別,java中默認填充方式是RSA/ECB/PKCS1Padding,Cipher.getInstance("RSA/ECB/PKCS1Padding");android不是
『貳』 android rsa加解密私鑰和公鑰怎麼用
php服務端與客戶端交互、提供開放api時,通常需要對敏感的部分api數據傳輸進行數據加密,這時候rsa非對稱加密就能派上用處了,下面通過一個例子來說明如何用php來實現數據的加密解密 1、加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能通過公鑰解密(反過來亦可以) 下載開源RSA密鑰生成工具openssl(通常Linux系統都自帶該程序),解壓縮至獨立的文件夾,進入其中的bin目錄,執行以下命令: openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一條命令生成原始 RSA私鑰文件 rsa_private_key.pem,第二條命令將原始 RSA私鑰轉換為 pkcs8格式,第三條生成RSA公鑰 rsa_public_key.pem 從上面看出通過私鑰能生成對應的公鑰,因此我們將私鑰private_key.pem用在伺服器端,公鑰發放給android跟ios等前端 2、php中用生成的公鑰、私鑰進行加密解密,直接上代碼 <?php $private_key = '-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl / Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB 2h5syHQ5qslPSGYJ1M/+herqxaVwWs6 /2VWc2T5MDmxLhAkEA3pwGpvXgLiWL /+x/gaq deJU//OTv1a3SqcCE1f+ oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2 / -----END RSA PRIVATE KEY-----'; $public_key = '-----BEGIN PUBLIC KEY----- //sR2tXw0wrC2DySx8vNGlqt 3Y7ldU9+ Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o 2n1vP1D+tD3amHsK7QIDAQAB -----END PUBLIC KEY-----'; //echo $private_key; $pi_key = openssl_pkey_get_private($private_key);//這個函數可用來判斷私鑰是否是可用的,可用返回資源id Resource id $pu_key = openssl_pkey_get_public($public_key);//這個函數可用來判斷公鑰是否是可用的 print_r($pi_key);echo "\n"; print_r($pu_key);echo "\n"; $data = "aassssasssddd";//原始數據 $encrypted = ""; $decrypted = ""; echo "source data:",$data,"\n"; echo "private key encrypt:\n"; openssl_private_encrypt($data,$encrypted,$pi_key);//私鑰加密 $encrypted = base64_encode($encrypted);//加密後的內容通常含有特殊字元,需要編碼轉換下,在網路間通過url傳輸時要注意base64編碼是否是url安全的 echo $encrypted,"\n"; echo "public key decrypt:\n"; openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私鑰加密的內容通過公鑰可用解密出來 echo $decrypted,"\n"; echo "---------------------------------------\n"; echo "public key encrypt:\n"; openssl_public_encrypt($data,$encrypted,$pu_key);//公鑰加密 $encrypted = base64_encode($encrypted); echo $encrypted,"\n"; echo "private key decrypt:\n"; openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私鑰解密 echo $decrypted,"\n";
『叄』 php openssl生成的rsa密鑰給android和ios使用注意哪些問題
openssl的功能:*生成RSA,DSA雙密匙(還可以再給他們簽名)*生成X509證書*計算印章(MD5,SHA,,RIPEMD160)用於加密大文件*加密,解密(演算法有DES,IDEA,RC2,RC4,Blowfish)*SSL伺服器端/客戶端測試*處理簽名或加密了的
『肆』 什麼是手機破解RSA 有什麼用呢
簡單的說~~~RSA~~、就是保護手機的!!! 一般別破`~~
『伍』 android 提交的rsa加密,服務端怎麼解密
首先介紹下命令台下openssl工具的簡單使用: 生成一個密鑰: openssl genrsa -out test.key 1024 這里-out指定生成文件的。需要注意的是這個文件包含了公鑰和密鑰兩部分,也就是說這個文件即可用來加密也可以用來解密。後面的1024是生成密鑰的長...
『陸』 求助,在android端使用openssl生成的rsapublicKey解密的相關問題
首先介紹下命令台下openssl工具的簡單使用:
生成一個密鑰:
openssl genrsa -out test.key 1024
這里-out指定生成文件的。需要注意的是這個文件包含了公鑰和密鑰兩部分,也就是說這個文件即可用來加密也可以用來解密。後面的1024是生成密鑰的長度。
openssl可以將這個文件中的公鑰提取出來:
openssl rsa -in test.key -pubout -out test_pub.key
-in指定輸入文件,-out指定提取生成公鑰的文件名。至此,我們手上就有了一個公鑰,一個私鑰(包含公鑰)。現在可以將用公鑰來加密文件了。
我在目錄中創建一個hello的文本文件,然後利用此前生成的公鑰加密文件:
openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
-in指定要加密的文件,-inkey指定密鑰,-pubin表明是用純公鑰文件加密,-out為加密後的文件。
解密文件:
openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
-in指定被加密的文件,-inkey指定私鑰文件,-out為解密後的文件。
至此,一次加密解密的過程告終。在實際使用中還可能包括證書,這個以後有機會再說~
-------------------------------------------------------------------------------------------------------------------
下來介紹下在程序如何利用之前生成的test.key和test_pub.key來進行信息的加密與解密(當然也可以直接利用openssl的API來生成密鑰文件)。
下面是一個例子,這個例子利用已有的密鑰來對source字元串進行加密與解密:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<openssl/rsa.h>
5 #include<openssl/pem.h>
6 #include<openssl/err.h>
7 #define OPENSSLKEY "test.key"
8 #define PUBLICKEY "test_pub.key"
9 #define BUFFSIZE 1024
10 char* my_encrypt(char *str,char *path_key);//加密
11 char* my_decrypt(char *str,char *path_key);//解密
12 int main(void){
13 char *source="i like dancing !";
14 char *ptr_en,*ptr_de;
15 printf("source is :%s\n",source);
16 ptr_en=my_encrypt(source,PUBLICKEY);
17 printf("after encrypt:%s\n",ptr_en);
18 ptr_de=my_decrypt(ptr_en,OPENSSLKEY);
19 printf("after decrypt:%s\n",ptr_de);
20 if(ptr_en!=NULL){
21 free(ptr_en);
22 }
23 if(ptr_de!=NULL){
24 free(ptr_de);
25 }
26 return 0;
27 }
28 char *my_encrypt(char *str,char *path_key){
29 char *p_en;
30 RSA *p_rsa;
31 FILE *file;
32 int flen,rsa_len;
33 if((file=fopen(path_key,"r"))==NULL){
34 perror("open key file error");
35 return NULL;
36 }
37 if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
38 //if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){ 換成這句死活通不過,無論是否將公鑰分離源文件
39 ERR_print_errors_fp(stdout);
40 return NULL;
41 }
42 flen=strlen(str);
43 rsa_len=RSA_size(p_rsa);
44 p_en=(unsigned char *)malloc(rsa_len+1);
45 memset(p_en,0,rsa_len+1);
46 if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){
47 return NULL;
48 }
49 RSA_free(p_rsa);
50 fclose(file);
51 return p_en;
52 }
53 char *my_decrypt(char *str,char *path_key){
54 char *p_de;
55 RSA *p_rsa;
56 FILE *file;
57 int rsa_len;
58 if((file=fopen(path_key,"r"))==NULL){
59 perror("open key file error");
60 return NULL;
61 }
62 if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
63 ERR_print_errors_fp(stdout);
64 return NULL;
65 }
66 rsa_len=RSA_size(p_rsa);
67 p_de=(unsigned char *)malloc(rsa_len+1);
68 memset(p_de,0,rsa_len+1);
69 if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){
70 return NULL;
71 }
72 RSA_free(p_rsa);
73 fclose(file);
74 return p_de;
75 }
『柒』 安卓手機被加密什麼軟體都安裝不了 該怎麼破解
只需要幾個常見的漏洞、一些GPU和一些時間。安卓在數百萬設備上的全盤加密功能能夠輕易被暴力破解,這情況比人們之前的預期要糟糕的多。而且,已經有工作代碼能證明這一點。
通常而言,如果有人拿到了你使用高通驍龍處理器的手機,就有可能通過一個很容易使用的Python腳本來破解其文件系統的內容,而不需要知道密碼或PIN。信息安全君告訴你,看不懂下面的內容也不要緊,你只要知道,你的安卓手機無論怎樣加密,都是可以被破解的就行。要緊的是你有一個時刻警惕的信息安全意識。
技術細節
安卓會通過一個隨機生成的128位設備加密密鑰 (Device Encryption Key, DEK) 來加密設備的文件系統。安卓使用用戶的PIN或者密碼來加密DEK,並將它存儲在設備加密過的文件系統上。從物理上來講,它也在設備的快閃記憶體晶元中。當你輸入正確的PIN或密碼時,設備可以解鎖DEK,並使用密鑰來解鎖文件系統。
不過,它也不像上面說的這么簡單:DEK實際上是使用用戶的PIN或密碼,外加一個被稱為KeyMaster Key Blob的加密數據塊來進行加密的。這個數據塊包含一個由KeyMaster程序生成的2048位RSA密鑰,它運行在設備處理器上的一個安全區域上。KeyMaster會創建RSA密鑰,將其存儲在數據塊中,並為安卓系統創建一份加密過的拷貝版本。
必須意識到,安卓系統和你的移動應用運行在處理器的非安全區域上。安卓沒有訪問KeyMaster的安全世界的許可權,因此它無法知曉數據塊里的RSA密鑰。安卓只能獲得這個數據塊的加密版本,而只有KeyMaster能夠解密它。
當你輸入PIN或密碼時,安卓拿到加密過的數據塊,並將它和使用scrypt處理過的PIN或密碼一起,傳回運行在處理器安全區域上的KeyMaster。KeyMaster將私密地使用處理器中帶有的私鑰來對數據塊進行解密,獲得長RSA密鑰。然後,它將私密地使用scrypt處理過的PIN或密碼,外加長RSA密鑰,來製造一個RSA簽名,並將簽名發回給安卓。之後安卓使用一系列演算法來處理這一簽名,並最終解密DEK,解鎖設備。
因此,全部流程都基於KeyMaster的數據塊。數據塊包含解密DEK所需的長RSA密鑰。安卓只擁有加密後的數據塊,而只有用戶才有PIN或密碼。此外,只有KeyMaster才能解密加密過的數據塊。
如果你能解密數據塊並提取其RSA密鑰,你就有走過了解密文件系統的大半部分流程:這時你就可以真的開始暴力破解PIN或密碼,來完成解鎖流程。理想情況下,你永遠無法獲得解密後的數據塊。然而,總有例外。
漏洞
安卓定義了KeyMaster的工作方法,但將實現工作留給了硬體製造商。高通在其ARM適配的驍龍系統中提供了KeyMaster。驍龍是基於晶元的系統,被數以百萬計的手機、平板和其它電子產品使用。KeyMaster運行在處理器的TrustZone里,它是在多個ARM核心之間的一個獨立區域。操作系統在TrustZone之外運行,而且,理想情況下,無法干預安全區。特定的功能,比如加密和指紋掃描,都運行在被保護的TrustZone上。
安全研究人員Gal Beniamini一直在研究高通的TrustZone代碼,如今他發布了一份詳細報告,描述如何從設備KeyMaster中提取密鑰。
高通在TrustZone中運行一個小內核,它提供了所謂的QSEE功能:Qualcomm Secure Execution Enviromment,小應用被允許在安卓之外,在QSEE上運行。
高通的KeyMaster正是QSEE應用。Beniamini詳細描述了如何通過利用某個安卓內核安全漏洞,載入你自己的QSEE應用,之後,在受保護的空間里,利用一個高通TrustZone內核的提權漏洞,獲取整個QSEE空間的控制權。之後,你就可以偷窺KeyMaster並且提取解密後的數據塊。
使用這一數據塊,你就有可能通過暴力破解餘下的密鑰:PIN或密碼,來解密文件系統。但如果沒有數據塊的RSA私鑰,這將完全不可能。
這一部分是安全漏洞,另一方面也是設計瑕疵:KeyMaster讓關鍵密鑰能夠被軟體使用,但軟體是在一個隔離的花園里運行的,因此,黑客的人物應該是越過隔離,並且拿到里邊的獎勵。惡意應用可以通過攻擊安卓內核掌握QSEE區域,來開始這一過程;或者,陷阱簡訊可以溜進StageFright,並且切入TrustZone。
此外,FBI表示,有可能在一個TrustZone已經被黑客控制的設備上刷入定製安卓固件,並且提取KeyMaster密鑰,並進一步製造暴力破解並獲取整個系統許可權的可能性。
「安卓在所有的設備之間都使用完全相同的全盤加密策略。該策略基於KeyMaster模塊,來將密鑰與設備的硬體綁定。我的研究表明,完全可以在高通的設備上繞過這一綁定過程。此外,該策略也有可能適用於其它SoC製造商的產品