当前位置:首页 » 编程语言 » 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