導航:首頁 > 編程語言 > phpandroidaes

phpandroidaes

發布時間:2022-04-24 22:41:29

『壹』 php中aes加密和rsa加密的區別

這個跟php沒有關系,單純的是兩個密碼學的演算法。如果真想搞清楚區別,你需要有密碼學的基礎知識。

我簡單說一下,這兩個都是標準的密碼學演算法,應用廣泛。AES是一個對稱加密演算法,常常用於對數據進行加密,RSA是一個非對稱(公鑰)加密演算法,常常用於對AES加密用的密鑰進行加密,或者進行數字簽名等。

至於對稱加密演算法和非對稱加密演算法的區別說起來就越來越多了。你只要知道以下事實就好:

  1. 對稱加密演算法加解密密鑰相同,而非對稱加密演算法加解密密鑰不同

  2. 對稱加密演算法相對於非對稱加密演算法而言往往加解密速度很快

  3. 非對稱加密演算法具有任何有公鑰的人都能加密數據,但是只有有私鑰的人才能解密數據的特點

『貳』 AES加密 在PC上和android上不一樣 怎麼解決

你沒有指定RNG的Provider
未指定的情況下 Android 2.3以上版本使用的是 隨機數序列是 Android's OpenSSL-backed security provider
以下版本是 BouncyCastle Security Provider

JDK 1.7內沒有這個Provider, 這個Android自己搞的,你服務端一定解不出來的。

目前Android支持的 RNG有以下幾種

Android's OpenSSL-backed security provider 1ASN.1, DER, PkiPath, PKCS7
BouncyCastle Security Provider v1.49 HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature) Harmony JSSE Provider Android KeyStore security provider
服務端如果也沒指定的話,默認使用的是

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, javaPolicy Policy; JavaLoginConfig Configuration)
Oracle JDK 1.7 環境下 支持以下

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
Sun RSA signature provider
Sun Elliptic Curve provider (EC, ECDSA, ECDH)
Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
Sun (Kerberos v5, SPNEGO)
Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
Sun PC/SC provider
Sun's Microsoft Crypto API provider

你們服務端要是用的 什麼 OPENJDK 第三方虛擬機,php什麼的話,那就只有天知道支不支持了。

不過你看也知道了 JDK里的都是SUN自己搞的, Android JVM里掛載的不是Android專用的就是第三方開源的,我估計你是找不到一樣的 隨機數生成器 方案了

『叄』 php aes加密~呢

AES加密演算法

密碼學中的高級加密標准(AdvancedEncryptionStandard,AES),又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標准。這個標准用來替代原先的DES,已經被多方分析且廣為全世界所使用。

<?php

classCryptAES

{

protected$cipher=MCRYPT_RIJNDAEL_128;

protected$mode=MCRYPT_MODE_ECB;

protected$pad_method=NULL;

protected$secret_key='';

protected$iv='';

publicfunctionset_cipher($cipher)

{

$this->cipher=$cipher;

}

publicfunctionset_mode($mode)

{

$this->mode=$mode;

}

publicfunctionset_iv($iv)

{

$this->iv=$iv;

}

publicfunctionset_key($key)

{

$this->secret_key=$key;

}

publicfunctionrequire_pkcs5()

{

$this->pad_method='pkcs5';

}

protectedfunctionpad_or_unpad($str,$ext)

{

if(is_null($this->pad_method))

{

return$str;

}

else

{

$func_name=__CLASS__.'::'.$this->pad_method.'_'.$ext.'pad';

if(is_callable($func_name))

{

$size=mcrypt_get_block_size($this->cipher,$this->mode);

returncall_user_func($func_name,$str,$size);

}

}

return$str;

}

protectedfunctionpad($str)

{

return$this->pad_or_unpad($str,'');

}

protectedfunctionunpad($str)

{

return$this->pad_or_unpad($str,'un');

}

publicfunctionencrypt($str)

{

$str=$this->pad($str);

$td=mcrypt_mole_open($this->cipher,'',$this->mode,'');

if(empty($this->iv))

{

$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);

}

else

{

$iv=$this->iv;

}

mcrypt_generic_init($td,hex2bin($this->secret_key),$iv);

$cyper_text=mcrypt_generic($td,$str);

$rt=strtoupper(bin2hex($cyper_text));

mcrypt_generic_deinit($td);

mcrypt_mole_close($td);

return$rt;

}

publicfunctiondecrypt($str){

$td=mcrypt_mole_open($this->cipher,'',$this->mode,'');

if(empty($this->iv))

{

$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);

}

else

{

$iv=$this->iv;

}

mcrypt_generic_init($td,$this->secret_key,$iv);

//$decrypted_text=mdecrypt_generic($td,self::hex2bin($str));

$decrypted_text=mdecrypt_generic($td,base64_decode($str));

$rt=$decrypted_text;

mcrypt_generic_deinit($td);

mcrypt_mole_close($td);

return$this->unpad($rt);

}

publicstaticfunctionhex2bin($hexdata){

$bindata='';

$length=strlen($hexdata);

for($i=0;$i<$length;$i+=2)

{

$bindata.=chr(hexdec(substr($hexdata,$i,2)));

}

return$bindata;

}

publicstaticfunctionpkcs5_pad($text,$blocksize)

{

$pad=$blocksize-(strlen($text)%$blocksize);

return$text.str_repeat(chr($pad),$pad);

}

publicstaticfunctionpkcs5_unpad($text)

{

$pad=ord($text{strlen($text)-1});

if($pad>strlen($text))returnfalse;

if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad)returnfalse;

returnsubstr($text,0,-1*$pad);

}

}

//密鑰

$keyStr='';

//加密的字元串

$plainText='test';

$aes=newCryptAES();

$aes->set_key($keyStr);

$aes->require_pkcs5();

$encText=$aes->encrypt($plainText);

echo$encText;

?>

『肆』 Android在用AES加密字元串之後再用base64加密,加密的結果跟ios端不一樣,

之前在項目上用到AES256加密解密演算法,剛開始在java端加密解密都沒有問題,在iOS端加密解密也沒有問題。但是奇怪的是在java端加密後的文件在iOS端無法正確解密打開,然後簡單測試了一下,發現在java端和iOS端採用相同明文,相同密鑰加密後的密文不一樣!上網查了資料後發現iOS中AES加密演算法採用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。我們知道加密演算法由演算法+模式+填充組成,所以這兩者不同的填充演算法導致相同明文相同密鑰加密後出現密文不一致的情況。那麼我們需要在java中用PKCS7Padding來填充,這樣就可以和iOS端填充演算法一致了。
要實現在java端用PKCS7Padding填充,需要用到bouncycastle組件來實現,下面我會提供該包的下載。啰嗦了一大堆,下面是一個簡單的測試,上代碼!
001 package com.encrypt.file;
002
003
004 import java.io.UnsupportedEncodingException;
005 importjava.security.Key;
006 import java.security.Security;
007
008 importjavax.crypto.Cipher;
009 importjavax.crypto.SecretKey;
010 importjavax.crypto.spec.SecretKeySpec;
011
012 public classAES256Encryption{
013
014 /**
015 * 密鑰演算法
016 * java6支持56位密鑰,bouncycastle支持64位
017 * */
018 public static finalString KEY_ALGORITHM="AES";
019
020 /**
021 * 加密/解密演算法/工作模式/填充方式
022 *
023 * JAVA6 支持PKCS5PADDING填充方式
024 * Bouncy castle支持PKCS7Padding填充方式
025 * */
026 public static finalString CIPHER_ALGORITHM="AES/ECB/PKCS7Padding";
027
028 /**
029 *
030 * 生成密鑰,java6隻支持56位密鑰,bouncycastle支持64位密鑰
031 * @return byte[] 二進制密鑰
032 * */
033 public static byte[] initkey() throwsException{
034
035 // //實例化密鑰生成器
036 // Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
037 // KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM, "BC");
038 // //初始化密鑰生成器,AES要求密鑰長度為128位、192位、256位
039 //// kg.init(256);
040 // kg.init(128);
041 // //生成密鑰
042 // SecretKey secretKey=kg.generateKey();
043 // //獲取二進制密鑰編碼形式
044 // return secretKey.getEncoded();
045 //為了便於測試,這里我把key寫死了,如果大家需要自動生成,可用上面注釋掉的代碼
046 return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c,
047 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07, 0x0a, 0x04, 0x0f,
048 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09,
049 0x06, 0x07, 0x09, 0x0d };
050 }
051
052 /**
053 * 轉換密鑰
054 * @param key 二進制密鑰
055 * @return Key 密鑰
056 * */
057 public static Key toKey(byte[] key) throwsException{
058 //實例化DES密鑰
059 //生成密鑰
060 SecretKey secretKey=newSecretKeySpec(key,KEY_ALGORITHM);
061 returnsecretKey;
062 }
063
064 /**
065 * 加密數據
066 * @param data 待加密數據
067 * @param key 密鑰
068 * @return byte[] 加密後的數據
069 * */
070 public static byte[] encrypt(byte[] data,byte[] key) throwsException{
071 //還原密鑰
072 Key k=toKey(key);
073 /**
074 * 實例化
075 * 使用 PKCS7PADDING 填充方式,按如下方式實現,就是調用bouncycastle組件實現
076 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
077 */
078 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
079 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM, "BC");
080 //初始化,設置為加密模式
081 cipher.init(Cipher.ENCRYPT_MODE, k);
082 //執行操作
083 returncipher.doFinal(data);
084 }
085 /**
086 * 解密數據
087 * @param data 待解密數據
088 * @param key 密鑰
089 * @return byte[] 解密後的數據
090 * */
091 public static byte[] decrypt(byte[] data,byte[] key) throwsException{
092 //歡迎密鑰
093 Key k =toKey(key);
094 /**
095 * 實例化
096 * 使用 PKCS7PADDING 填充方式,按如下方式實現,就是調用bouncycastle組件實現
097 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
098 */
099 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
100 //初始化,設置為解密模式
101 cipher.init(Cipher.DECRYPT_MODE, k);
102 //執行操作
103 returncipher.doFinal(data);
104 }
105 /**
106 * @param args
107 * @throws UnsupportedEncodingException
108 * @throws Exception
109 */
110 public static void main(String[] args) {
111
112 String str="AES";
113 System.out.println("原文:"+str);
114
115 //初始化密鑰
116 byte[] key;
117 try {
118 key = AES256Encryption.initkey();
119 System.out.print("密鑰:");
120 for(int i = 0;i<key.length;i++){
121 System.out.printf("%x", key[i]);
122 }
123 System.out.print("\n");
124 //加密數據
125 byte[] data=AES256Encryption.encrypt(str.getBytes(), key);
126 System.out.print("加密後:");
127 for(int i = 0;i<data.length;i++){
128 System.out.printf("%x", data[i]);
129 }
130 System.out.print("\n");
131
132 //解密數據
133 data=AES256Encryption.decrypt(data, key);
134 System.out.println("解密後:"+newString(data));
135 } catch (Exception e) {
136 // TODO Auto-generated catch block
137 e.printStackTrace();
138 }
139
140 }
141 }
運行程序後的結果截圖:

ViewController.m文件

01 //
02 // ViewController.m
03 // AES256EncryptionDemo
04 //
05 // Created by 孫 裔 on 12-12-13.
06 // Copyright (c) 2012年 rich sun. All rights reserved.
07 //
08
09 #import "ViewController.h"
10 #import "EncryptAndDecrypt.h"
11
12 @interface ViewController ()
13
14 @end
15
16 @implementation ViewController
17 @synthesize plainTextField;
18 - (void)viewDidLoad
19 {
20 [super viewDidLoad];
21 // Do any additional setup after loading the view, typically from a nib.
22 }
23
24 - (void)didReceiveMemoryWarning
25 {
26 [super didReceiveMemoryWarning];
27 // Dispose of any resources that can be recreated.
28 }
29 //這個函數實現了用戶輸入完後點擊視圖背景,關閉鍵盤
30 - (IBAction)backgroundTap:(id)sender{
31 [plainTextField resignFirstResponder];
32 }
33
34 - (IBAction)encrypt:(id)sender {
35
36 NSString *plainText = plainTextField.text;//明文
37 NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
38
39 //為了測試,這里先把密鑰寫死
40 Byte keyByte[] = {0x08,0x08,0x04,0x0b,0x02,0x0f,0x0b,0x0c,0x01,0x03,0x09,0x07,0x0c,0x03,
41 0x07,0x0a,0x04,0x0f,0x06,0x0f,0x0e,0x09,0x05,0x01,0x0a,0x0a,0x01,0x09,
42 0x06,0x07,0x09,0x0d};
43 //byte轉換為NSData類型,以便下邊加密方法的調用
44 NSData *keyData = [[NSData alloc] initWithBytes:keyByte length:32];
45 //
46 NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyData];
47 Byte *plainTextByte = (Byte *)[cipherTextData bytes];
48 for(int i=0;i<[cipherTextData length];i++){
49 printf("%x",plainTextByte[i]);
50 }
51
52 }
53 @end

『伍』 php AES加密對不上java的加密,請問如何實現

要注意特定的Padding實現跟演算法的blockSize有關,這里php的blocksize是在php的aes加密前先對源字元串進行Padding,問題得到解決。

『陸』 php接收android數據產生中文亂碼:

mysql中編碼是不是utf-8的?

『柒』 php AES加密,怎樣用CTR加密模式

分組密碼有五種工作體制:1.電碼本模式(Electronic Codebook Book (ECB));2.密碼分組鏈接模式(Cipher Block Chaining (CBC));3.計算器模式(Counter (CTR));4.密碼反饋模式(Cipher FeedBack (CFB));5.輸出反饋模式(Output FeedBack (OFB))。
以下逐一介紹一下:
1.電碼本模式(Electronic Codebook Book (ECB)
這種模式是將整個明文分成若干段相同的小段,然後對每一小段進行加密。
2.密碼分組鏈接模式(Cipher Block Chaining (CBC))
這種模式是先將明文切分成若干小段,然後每一小段與初始塊或者上一段的密文段進行異或運算後,再與密鑰進行加密。
3.計算器模式(Counter (CTR))
計算器模式不常見,在CTR模式中, 有一個自增的運算元,這個運算元用密鑰加密之後的輸出和明文異或的結果得到密文,相當於一次一密。這種加密方式簡單快速,安全可靠,而且可以並行加密,但是在計算器不能維持很長的情況下,密鑰只能使用一次。
4.密碼反饋模式(Cipher FeedBack (CFB))
這種模式較復雜。
5.輸出反饋模式(Output FeedBack (OFB))
這種模式較復雜。

『捌』 如何在php中實現AES加密

文件加密建議:
1.下載 Abel文件加密器 1.1(軟體大小39KB,簡體中文,免費版,綠色軟體,無須安裝。)
iask.tech.sina/ishare/browse_file.php?fileid=87135
2.在非系統盤里建一文件夾,把壓縮文件解壓其中.
點擊文件加密器(AbelLock)圖標---出現「文件列表」,點擊「添加」---出現打開,在「查找范圍」,點&quot;Abel文件加密器 1.1&quot;右面的▲下拉框符號,選擇你需加密文件的路經及文件,單擊後會出現在「文件名」顯示框中,點擊「打開」---輸入密碼.確認密碼後點擊「加密」,點擊退出.

『玖』 我從事PHP開發已經有兩年了,程序方面也只懂PHP的,現在想轉向android方面,請問android會比PHP要難學嗎

android就是一個java的子集,其實程序是相通的,如果你對php的面向對象很熟悉了,那麼我想學習java或者android編程應該都不會困難,只不過需要大量的練習來積累經驗罷了。

『拾』 PHP如何實現AES加解密

php載入Mcrypt組件php_mycrypt.dll/.so,支持AES和3DES編碼,
只是該模塊沒有提供補齊padding方法,要自己用PHP代碼寫PKCS7之類的補齊方法

閱讀全文

與phpandroidaes相關的資料

熱點內容
機明自動編程軟體源碼 瀏覽:325
php埠號設置 瀏覽:540
phperegreplace 瀏覽:319
androidgridview翻頁 瀏覽:537
ssh協議編程 瀏覽:634
如何開我的世界電腦伺服器地址 瀏覽:861
玄關pdf 瀏覽:609
程序員學習論壇 瀏覽:940
程序員的毒雞湯怎麼做 瀏覽:547
安卓怎麼降級軟體到手機 瀏覽:281
雲與伺服器入門書籍推薦產品 瀏覽:636
delphi編程助手 瀏覽:761
電腦遇到伺服器問題怎麼辦 瀏覽:515
加工中心編程結束方法 瀏覽:296
了解什麼是web伺服器 瀏覽:139
面向對象的編程的基本特徵 瀏覽:718
php定時執行任務linux 瀏覽:787
php數組中刪除元素 瀏覽:724
螢石雲伺服器視頻 瀏覽:269
防火牆配置伺服器熱備的虛擬地址 瀏覽:189