當前位置:首頁 » 編程語言 » php二進制加密

php二進制加密

發布時間: 2025-08-02 13:51:04

php加密文件 解密data 轉nsstring 為nil. rc4 ios

IOS:引入ios自帶庫 #include

先以DES加密演算法為例講解,DES的加密和解密都同用一個Key,下面兩個加解密函數如下:
//加密
-(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
{
//一般對加密的字元串採用UTF-8編碼 NSData存儲的就是二進制數據
NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//確定加密過後的字元串在內存中存放的大小,根據文檔,對於塊密碼方式(這個庫還包括流密碼方式)
//加密過後的字元串大小總是小於或等於加密之前數據的大小加上對應加密演算法的塊大小
//但看到一些大牛還這樣一下 & ~(kCCBlockSizeDES - 1) 目前不知道為嘛
size_t bufferSize = ([data length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
//void *buffer = malloc(bufferSize);//可以手動創建buffer,但之後要記得free掉
unsigned char buffer[bufferSize]; //定義輸出加密串所佔內存空間
memset(buffer, 0, sizeof(char)); //採用ios中宏定義好的方法分配空間,可免去手動free
size_t numBytesEncrypted = 0; //輸出加密串的位元組數

//加密數據,採用庫中的CCCrypt方法,這個方法會按次序執行CCCrytorCreate(),
// CCCryptorUpdate(), CCCryptorFinal(), and CCCryptorRelease() 如果開發者自己create這個對象,
//那麼後面就必須執行final、release之類的函數,CCCrypt方法一次性解決

// Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
//Byte iv[] = {1,2,3,4,5,6,7,8}; 加密所需的隨機字元
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, //加密方式,kCCEncrypt加密 kCCDecrypt解密
kCCAlgorithmDES, //採用的加密演算法,內置包含AES、DES、
//3DES、其他還有四個,不知道是什麼
//後續討論
//加密額外參數,注意此處各個平台之間指定的時候要記得一樣
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String], //加密密匙 UTF8的字元串
kCCKeySizeDES, //密匙長度位元組 各演算法有對應的長度宏
nil, //隨機字元,可指定也可不指定,各平台之間不絕對
[data bytes], //待加密串的位元組長度
[data length], //待加密串的長度
buffer, //輸出已加密串的內存地址
bufferSize, //已加密串的大小
&numBytesEncrypted);

NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
plainText = [GTMBase64 stringByEncodingData:dataTemp];
}else{
NSLog(@"DES加密失敗");
}
return plainText;
}

//解密
-(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {
// 利用 GTMBase64 解碼 Base64 字串
NSData* cipherData = [GTMBase64 decodeString:cipherText];
size_t bufferSize = ([cipherData length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
//unsigned char buffer[1024];
unsigned char buffer[bufferSize];
memset(buffer, 0, sizeof(char));
size_t numBytesDecrypted = 0;

// IV 偏移量不需使用
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
nil,
[cipherData bytes],
[cipherData length],
buffer,
bufferSize,//1024,
&numBytesDecrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
}
return plainText;
}

java和php平台的代碼實現:

Java代碼 收藏代碼
import java.io.IOException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DES {

private byte[] desKey;

public DES(String desKey) {
this.desKey = desKey.getBytes();
}

public byte[] desEncrypt(byte[] plainText) throws Exception {
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = desKey;
DESKeySpec dks = new DESKeySpec(rawKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key, sr);
byte data[] = plainText;
byte encryptedData[] = cipher.doFinal(data);
return encryptedData;
}

public byte[] desDecrypt(byte[] encryptText) throws Exception {
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = desKey;
DESKeySpec dks = new DESKeySpec(rawKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key, sr);
byte encryptedData[] = encryptText;
byte decryptedData[] = cipher.doFinal(encryptedData);
return decryptedData;
}

public String encrypt(String input) throws Exception {
return base64Encode(desEncrypt(input.getBytes()));
}

public String decrypt(String input) throws Exception {
byte[] result = base64Decode(input);
return new String(desDecrypt(result));
}

public static String base64Encode(byte[] s) {
if (s == null)
return null;
BASE64Encoder b = new sun.misc.BASE64Encoder();
return b.encode(s);
}

public static byte[] base64Decode(String s) throws IOException {
if (s == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(s);
return b;
}

public static void main(String[] args) throws Exception {
String key = "abcdefgh";
String input = "a";
DES crypt = new DES(key);
System.out.println("Encode:" + crypt.encrypt(input));
System.out.println("Decode:" + crypt.decrypt(crypt.encrypt(input)));
}
}

php 方法一
Php代碼 收藏代碼
<?php
class DES1 {
var $key;
function DES1($key) {
$this->key = $key;
}
function encrypt($input) {
$size = mcrypt_get_block_size('des', 'ecb');
$input = $this->pkcs5_pad($input, $size);
$key = $this->key;
$td = mcrypt_mole_open('des', '', 'ecb', '');
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
@mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
$data = base64_encode($data);
return $data;
}
function decrypt($encrypted) {
$encrypted = base64_decode($encrypted);
$key =$this->key;
$td = mcrypt_mole_open('des','','ecb','');
//使用MCRYPT_DES演算法,cbc模式
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td, $key, $iv);
//初始處理
$decrypted = mdecrypt_generic($td, $encrypted);
//解密
mcrypt_generic_deinit($td);
//結束
mcrypt_mole_close($td);
$y=$this->pkcs5_unpad($decrypted);
return $y;
}
function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text) {
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text))
return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
return false;
return substr($text, 0, -1 * $pad);
}
}
$key = "abcdefgh";
$input = "a";
$crypt = new DES1($key);
echo "Encode:".$crypt->encrypt($input)."<br/>";
echo "Decode:".$crypt->decrypt($crypt->encr

⑵ 求大佬,解決一個php的自定義加密函數的

md5
按MD5演算法,從字元串得到32位的HASH。
urlencode
把URL做成可以放進地址欄的形式
urldecode
把放進地址欄的東西還原成URL
base64_encode
按BASE64演算法,把字元串(可以是二進制的)加密,得到長度與輸入有關,比輸入長很多,得到的字元范圍是可顯示的。
base64_decode
按BASE64演算法解密
ord
取一個字元串的第一個字母的ASCII代碼
chr
從一個數得到一個字元串,長度1,內容為以這個數為ASCII代碼的字元
explode
以第一個參數為分段符號,把第二個參數切斷,得到一個數組的字元串
implode
以第一個參數為連接符號,把第二個參數(一個數組的字元串)連接成一個字元串
count
返回字元串的長度
substr
取字元串的一部分
srand
設置隨機種子,同樣的隨機種子按照同樣的順序取到的隨機數必然相同,在PHP里一般用於DEBUG。在 PHP 較早版本中,必須在使用rand()之前調用 srand() 播下隨機數種子(以時間為srand的參數)。自 PHP 4.2.0 不再需要這樣做了(直接用rand()就好)。

⑶ php源碼怎麼加密

一、無需任何PHP擴展的加密

此類加密的代表有 威盾PHP加密專家、PHP在線加密平台、PHP神盾 等。

此類加密都是以eval函數為核心,輔以各式各樣的字元串混淆和各種小技巧,來達到加密目的(更准確的說,應該算是混淆)。下面以一個簡單的hello world為例來說明此類加密的大體過程。

<?php

echo "hello world";

首先 ,我們把這段代碼變為通過eval執行的

<?php

eval('echo "hello world";');

然後 ,我們再進行一些轉換,比如說base64編碼

<?php

eval(base64_decode('ZWNobyAiaGVsbG8gd29ybGQiOw=='));

就這樣子,我們的第一個加密過的php代碼新鮮出爐了。。。

上面這個例子非常非常簡單,基本上任何有一點php語言基礎甚至別的語言基礎的人都能輕松的看懂並解密。因此,我們需要一些方法讓這個加密至少看上去不是那麼簡單。

二、同時採用多種編碼函數

除了剛才提到的base64,php還有許多內置的編碼函數,例如urlencode、gzcompress等。把這些函數混合使用可以提高解密的復雜度(不是難度),此外還可以使用strtr來制定自己的編碼規則。 使用變數來代替函數名 使用特定字元來命名變數

這兒所說的特定字元是一些極其相似的字元,如I和1,0和O。試想一下滿屏都是O和0組成的變數,並且每一個的名字長度都在10個字元以上。。。 判斷文件自身是否被修改

這個功能看似容易,對文件做一下摘要再進行下對比即可知道是否被修改了,但是如何才能在文件內把摘要嵌入進去呢?我沒有找到完美的方案,但一個變通的方案還是很容易的。。。

<?php

$code = substr(file_get_contents(__FILE__), 0, -32);

$hash = substr(file_get_contents(__FILE__), -32);

if (md5($code) !== $hash) {

exit('file edited');

}

當然,你可以把這個校驗字元串放在別的位置來提高破解的難度。有了這個,別人想破解你的程序可就得多費一點功夫了。。。

既然知道了原理,那解密自然也就非常簡單了,總體來說就三步:

把eval替換為輸出,比如echo 根據編碼規則把字元串還原 如果文件未解密完全,從第一步開始繼續

當然,實際上的解密過程並沒有這么簡單,比如說如果加密的時候使用了gzcompress,那得到的數據將會包含一些二進制數據,而採用一般的文本編輯器打開時這些數據都會顯示為亂碼,並且在保存時丟失部分數據。解決方法很簡單也很麻煩,那就是使用二進制(16進制)方式打開、修改和保存。

⑷ php-beast 解密與加密 操作過程(詳細)

php-beast是高效且易用的PHP代碼保護擴展,適用於Windows和Linux操作系統。在安裝和使用過程中,有幾點需要注意,包括處理加密和解密的問題。以下將詳細介紹在不同操作系統下安裝和使用php-beast的方法,以及如何解決常見解密問題。

對於Windows版本的加密處理,推薦從GitHub下載對應的.dll文件,根據你的PHP版本和是否為線程安全選擇相應的文件。將.dll文件放置在指定的擴展目錄,並在php.ini配置文件中添加擴展配置,如`extension=php_beast_x86_nts.dll`。注意,秘鑰通常需要手動修改以確保安全性和兼容性,通常使用二進制編輯工具對特定位置進行修改即可。

Linux版本的加密處理相對復雜,首先需要在編譯前修改秘鑰。對於新版本,秘鑰的修改通常在`header.c`文件中進行,同時需要調整`aes_algo_lib.c`和`des_algo_handler.c`中的內容。編譯步驟包括下載源碼、修改配置文件、進行編譯和安裝。在安裝過程中可能會遇到找不到`php-config`的錯誤,此時需要通過`find`命令查找配置文件的位置,並確保正確指定`php-config`路徑。安裝完成後,需要將擴展添加到php配置文件中,並重啟PHP服務進行測試。

在解密方面,對於修改過密鑰的文件,解密難度較高,通常需要暴力破解或分析文件頭部信息以判斷加密類型。對於使用默認密鑰加密的文件,解密相對簡單,通常可以手動使用解密工具或在線工具進行解密。這些工具提供了方便的解密界面,用戶僅需選擇文件並執行解密操作即可。

總的來說,php-beast提供了強大的加密功能,為PHP代碼提供了保護,但同時也需要用戶在安裝和使用過程中注意秘鑰的管理和版本兼容性問題。對於解密問題,根據加密方式的不同,採用的方法也有所區別,但大部分情況下,通過適當的工具和方法,仍可實現文件的解密。

熱點內容
oracle存儲過程時間 發布:2025-08-06 03:10:49 瀏覽:164
linux命令在哪 發布:2025-08-06 03:10:19 瀏覽:662
如何下載安卓版街霸5 發布:2025-08-06 03:01:20 瀏覽:403
名爵3存儲卡怎麼放車上 發布:2025-08-06 02:57:08 瀏覽:184
訪問瑞士 發布:2025-08-06 02:38:44 瀏覽:128
搭路伺服器怎麼建 發布:2025-08-06 02:19:16 瀏覽:456
ram中存儲的數據在斷電後丟失 發布:2025-08-06 02:17:34 瀏覽:418
蘋果4和安卓手機卡有什麼區別 發布:2025-08-06 02:16:40 瀏覽:683
如何游戲編程 發布:2025-08-06 02:16:06 瀏覽:149
scala編程思想 發布:2025-08-06 01:57:01 瀏覽:217