base64加密源码
一、无需任何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进制)方式打开、修改和保存。
㈡ iOS加密2——Base64(苹果支持)
1、由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。
Base64编码使用和urlencode比较
base64:
1、包含A-Z a-z 0-9 和加号“+”,斜杠“/” 用来作为开始的64个数字. 等号“=”用来作为后缀用途。
2、2进制的.
3、要比源数据多33%。
4、常用于邮件。
urlencode:将除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)
请求参数传输使用base64,而不是使用urlencode,为什么?
1、部分因为base64编码后参数就不可读,而url编码英文部分是不变的
2、为了兼容网络上的一些很古老的设备, 这些古董设备只能识别 base64编码的字符
3、因为 urlencode 对二进制数据的效率不高,base64 会有效降低 %xx 的出现次数。
注释 :
1、url请求中,只对参数进行base64编码,不是对整个url进行base64编码。
2、在url请求时,会对url整体进行urlencode编码。
NSString *str = @"hello world"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; NSData *base64Data = [data base64EncodedDataWithOptions:0];
NSString *path = @"/Users/apple/Desktop/1.png"; NSData *data = [NSData dataWithContentsOfFile:path]; NSData *base64Data = [data base64EncodedDataWithOptions:0]; [base64Data writeToFile:@"/Users/apple/Desktop/base64" atomically:YES];
NSString *base64Str = [data :0]; NSLog(@"base64Str: %@",base64Str); NSLog(@"%@ %ld base64Data: %@ %ld",data,data.length,base64Data,base64Data.length);
NSData *endata = [[NSData alloc] initWithBase64EncodedData:base64Data options:0]; [endata writeToFile:@"/Users/apple/Desktop/123.png2" atomically:YES]; UIImage *image = [UIImage imageWithData:endata]; NSLog(@"%@",image);
和MD5一样我们采取封装的办法将base64封装进了MySecurities这个类中
MySecurities.h 文件
#import <Foundation/Foundation.h> @interface MySecurities : NSObject +(NSString *)base64EncodingWithData:(NSData *)sourceData;//base64加密 +(id)base64EncodingWithString:(NSString *)sourceString;//base64解密 @end
base64加密
@implementation MySecurities +(NSString *)base64EncodingWithData:(NSData *)sourceData{ if (!sourceData) { //如果sourceData则返回nil,不进行加密。 return nil; } NSString *resultString = [sourceData : ]; return resultString; } ***base64解密*** +(id)base64EncodingWithString:(NSString *)sourceString{ if (!sourceString) { return nil;//如果sourceString则返回nil,不进行解密。 } NSData *resultData = [[NSData alloc]initWithBase64EncodedString:sourceString options:]; return resultData; } @end
㈢ 伪加密算法:Base64
做过网络通信的iOSer对Base64都不会很陌生,涉及加密的数据通常会在传输之前做一次Base64转换,一般形式如下 Base64(DES/AES(Data)) ,所以有些iOSer就把Base64当作加密算法的一种,甚至一些在线工具也直接称呼Base64为加密/解密,实际上这误会可大了,本篇回答以下三个问题:
要回答第一个问题,首先来看看Base64的编码过程,这里以字符串 “1234” 为例,经过Base64编码后,结果为 "MTIzNA==" ,也是一个字符串,过程如下:
看到这里,你会疑问,这样的编码有什么用?
Base64真正的作用不是将字符串转换为另一个字符串,而是将任意二进制转换为字符串,这个字符串的范围还很小,只有64个,这就为那些只能传输字符串的协议传输数据带来方便,比如http,通过一些字符的替换,还可以避免特殊字符的冲突。
苹果已经提供了原生的API,用Swift做Base64编码:
NSData.Base64EncodingOptions 有四个可选值:
可以组合使用:
编码结果按76个字符换行,换行符为\r。
解码方法如下:
思考题:
编码过程中,6位补8位的规则是什么,是高位补0还是低位,为什么?经过深入思考的结果才是自己的哦,欢迎你的留言👏
㈣ 易语言 Base64的加密算法
代码-----------.版本 2.子程序 Base64编码, 字节集, 公开
.参数 原文, 字节集
.局部变量 余数, 整数型
.局部变量 三字节数据, 字节型, , "3"
.局部变量 码表, 字节集
.局部变量 len_x, 整数型
.局部变量 len_y, 整数型
.局部变量 结果, 字节集
.局部变量 i, 整数型
.局部变量 k, 整数型len_x = 取字节集长度 (原文)
.如果真 (len_x < 1)
返回 ({ })
.如果真结束
余数 = len_x % 3
.如果真 (余数 > 0)
原文 = 原文 + 取空白字节集 (3 - 余数)
len_x = len_x + 3 - 余数
.如果真结束
len_y = len_x × 4 ÷ 3
结果 = 取空白字节集 (len_y)
i = 1
码表 = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47 }
.变量循环首 (1, len_x, 3, k)
三字节数据 [1] = 原文 [k]
三字节数据 [2] = 原文 [k + 1]
三字节数据 [3] = 原文 [k + 2]
结果 [i] = 码表 [右移 (三字节数据 [1], 2) + 1]
结果 [i + 1] = 码表 [左移 (位与 (三字节数据 [1], 3), 4) + 右移 (三字节数据 [2], 4) + 1]
结果 [i + 2] = 码表 [左移 (位与 (三字节数据 [2], 15), 2) + 右移 (三字节数据 [3], 6) + 1]
结果 [i + 3] = 码表 [位与 (三字节数据 [3], 63) + 1]
i = i + 4
.变量循环尾 ()
.判断开始 (余数 = 2)
结果 [len_y] = 61
.判断 (余数 = 1)
结果 [len_y] = 61
结果 [len_y - 1] = 61
.默认.判断结束
返回 (结果).子程序 _按钮1_被单击编辑框1.加入文本 (到文本 (Base64编码 (到字节集 (编辑框1.内容))))
希望我可以帮到你
㈤ 求java加密源代码(MD5,base64)
import java.security.*;
import javax.crypto.*;
/**
* 本例解释如何利用DES私钥加密算法加解密
*
* @author Devon
* @version 1.0 04/03/10
*/
public class SingleKeyExample {
public static void main(String[] args) {
try {
String algorithm = "DES"; //定义加密算法,可用 DES,DESede,Blowfish
String message = "Hello World. 这是待加密的信息";
// 生成个DES密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
keyGenerator.init(56); //选择DES算法,密钥长度必须为56位
Key key = keyGenerator.generateKey(); //生成密钥
// 生成Cipher对象
Cipher cipher = Cipher.getInstance("DES");
//用密钥加密明文(message),生成密文(cipherText)
cipher.init(Cipher.ENCRYPT_MODE, key); //操作模式为加密(Cipher.ENCRYPT_MODE),key为密钥
byte[] cipherText = cipher.doFinal(message.getBytes()); //得到加密后的字节数组
System.out.println("加密后的信息: " + new String(cipherText));
//用密钥加密明文(plainText),生成密文(cipherByte)
cipher.init(Cipher.DECRYPT_MODE, key); //操作模式为解密,key为密钥
byte[] sourceText = cipher.doFinal(cipherText); //获得解密后字节数组
System.out.println("解密后的信息: " + new String(sourceText));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* @author Devon
*/
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
public class PairKeyExample {
public static void main(String argv[]) {
try {
String algorithm = "RSA"; //定义加密算法,可用 DES,DESede,Blowfish
String message = "张三,你好,我是李四";
//产生张三的密钥对(keyPairZhang)
KeyPairGenerator keyGeneratorZhang =
KeyPairGenerator.getInstance(algorithm); //指定采用的算法
keyGeneratorZhang.initialize(1024); //指定密钥长度为1024位
KeyPair keyPairZhang = keyGeneratorZhang.generateKeyPair(); //产生密钥对
System.out.println("生成张三的公钥对");
// 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节
byte[] publicKeyZhangEncode = keyPairZhang.getPublic().getEncoded();
//通过网络或磁盘等方式,把公钥编码传送给李四
//李四接收到张三编码后的公钥,将其解码
KeyFactory keyFacoryLi = KeyFactory.getInstance(algorithm); //得到KeyFactory对象
X509EncodedKeySpec x509KeySpec =
new X509EncodedKeySpec(publicKeyZhangEncode); //公钥采用X.509编码
PublicKey publicKeyZhang = keyFacoryLi.generatePublic(x509KeySpec); //将公钥的KeySpec对象转换为公钥
System.out.println("李四成功解码,得到张三的公钥");
//李四用张三的公钥加密信息,并发送给李四
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); //得到Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, publicKeyZhang); //用张三的公钥初始化Cipher对象
byte[] cipherMessage = cipher.doFinal(message.getBytes()); //得到加密信息
System.out.println("加密后信息:" + new String(cipherMessage));
System.out.println("加密完成,发送给李四...");
//张三用自己的私钥解密从李四处收到的信息
cipher.init(Cipher.DECRYPT_MODE, keyPairZhang.getPrivate()); //张三用其私钥初始化Cipher对象
byte[] originalMessage = cipher.doFinal(cipherMessage); //得到解密后信息
System.out.println("张三收到信息,解密后为:" + new String(originalMessage));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
㈥ Base64算法原理及实现
Base64算法最开始是被用于解决电子邮件数据传输问题。在早期,由于历史原因问题,电子邮件只允许使用ASCII字符,如果在邮件中出现了非ASCII字符,在通过某些网关进行数据转发的时候,网关会对这些非ASCII字符做出调整,例如,把ASCII码8位二进制码的最高位置为0。此时接收方在收到邮件时就会出现乱码。基于这个原因,产生了Base64算法。
Base64编码的思路说白了,就是把传输数据的每个字节映射成ASCII码表中的某些字符,这样在传输的过程中,就不会出现乱码的问题了。Base64算法定义了一个映射表,如下所示。
由上表可以看出,之所以称为Base64编码,实际上是把原数据映射成了ASCII码表中的64个字符。但是,64个字符最多能映射的位数是6bit。但是每个数据是8bit的,那怎么转换呢?Base64编码的基本思想: 将原数据每3个字节(24bit)分为一组,然后将这24bit数据按照每6bit一组,重新划分为4组,分组完成之后,再将每每6bit数据为单元进行映射。
Base64编码的基本流程如下:
例如,将字符串"ABC"进行Base64编码流程如下。
所以,字符串"ABC"经过Base64编码后的数据是"QUJD"。
从Base64编码的原理可以看到,Base64实际上就是把原来数据中的每3个字节一组进行Base64编码转换,编码之后变成4个Base64字符。但是如果原文数据长度不是3的整数倍的时候该怎么办呢?Base64算法规定,如果待加密数据不是3的整数倍,就在原文数据后面补0,直到长度凑够3的整数倍为止,然后再进行Base64编码转换。待编码转换完成之后,在结果末尾补充相同个数的"="。
例如,将字符串"ABCD"进行Base64编码流程如下。
所以,字符串"ABC"经过Base64编码后的字符串是"QUJDRA=="。
其实这里有个规律,当原文的数据长度除以3余数为0时,编码之后后面没有"=";当余数为1时,后面有两个"=",当余数是2时,后面有一个"=","="的个数也就是补充的字节数。
通过Base64的原理可以看到,Base64编码实际上是把原数据的3个字节映射成了4个字节,所以相比于原数据长度,编码后的长度会增加1/3。这也会降低传输效率。
Get方式和Post方式是Http请求常用的两种方式,某些情况下会要求使用Get方式来传递二进制数据。这时,可以先通过Base64编码来将二进制数据转换成字符串数据。由于符号"+"和符号"/"是不允许出现在Url中的,所以,产生了Url安全的Base64算法,所谓的Url安全的Base64算法,其实主要包含两个方面。
目前,在Java中,我们可以通过以下方式来是使用Base64算法。
在java8之前,JDK官方库中都没有内置Base64算法,其实Base64实现很简单,这个不知道为什么。但是Java8内置了Base64编码器和解码器。
在Java8中,Base64工具类提供了三种BASE64编解码器:
1.基本Base64编码
也就是完全按照标准Base64的映射规则来编解码,不添加任何行标。
2.Url Base64编码
JDK标准类库中的Url Base64编码是用"-"和"_"取代了"+"和"/"
3.MIME Base64编码
Java类库中还提供了一种格式更友好的Base64编码,这种编码输出每行不超过76字符,并且使用'
'并跟随'
'作为分割。
4.去除填充符的Base64
在Java标准类库中,还提供了一种方式来去除编码末尾的"=",就是在构建Encoder 对象后调用withoutPadding()方法,例如:
Commons Codec是Apache为Java开发者提供的一个开源软件类库,该类库中主要是一些常用的编码工具类包,例如DES、SHA1、MD5、Base64,URL等。在使用该类库之前需要首先在Eclipse中添加依赖。Commons Codec提供了以下Base64编码方式。
1.基本Base64编码
Commons Codec和Java标准类库提供给的Base64编码方式是一样的。
2.Url Base64编码
Url Base64编码和Java类库也是一样的,把"+"和"/"替换成了"-"和"_",有一个不同的地方是Commons Codec中的Url Base64默认去掉了后面的"=",相当于Java类库中调用了withouPadding方法,例如:
3.类MIME格式输出
Commons Codec中也提供了类似于Java类库中的MIME的格式化输出,在Commons Codec中有一个方法:
这里的isChunked置为true,就表示是按照MIME格式输出编码结果。
h
㈦ 跪求一份e4a 中文编程Base64加密和jie密源码
代码是我自己写的!水平有限,反正功能实现了。原来是迅雷链接转换的函数,已经修改为Base64加密了,可以直接用,解密的没有。。。需要的话参照易语言的修改吧。。。以下为函数:
函数 迅雷编码(原文本 为 文本型) 为 文本型
变量 原文 为 字节型()
变量 余数 为 整数型
变量 三字节数据 为 字节型(3)
变量 码表 为 字节型(64)
变量 len_x 为 整数型
变量 len_y 为 整数型
变量 i 为 整数型
变量 k 为 整数型
变量 结果 为 字节型()
变量 原文扩充 为 字节型(1)
变量 结果扩充 为 字节型(1)
'原文本 = "AA" & 原文本 & "ZZ"
原文 = 文本到字节(原文本 ,"GBK")
原文扩充(0) = 0
结果扩充(0) = 61
len_x = 取字节集长度 (原文)
余数 = len_x % 3
如果 (余数 = 1) 则
原文 = 合并字节集(原文 , 原文扩充)
原文 = 合并字节集(原文 , 原文扩充)
len_x = len_x + 2
否则如果 (余数 = 2) 则
原文 = 合并字节集(原文 , 原文扩充)
len_x = len_x + 1
结束 如果
len_y = len_x * 4 / 3
i = 1
码表(0) = 65
码表(1) = 66
码表(2) = 67
码表(3) = 68
码表(4) = 69
码表(5) = 70
码表(6) = 71
码表(7) = 72
码表(8) = 73
码表(9) = 74
码表(10) = 75
码表(11) = 76
码表(12) = 77
码表(13) = 78
码表(14) = 79
码表(15) = 80
码表(16) = 81
码表(17) = 82
码表(18) = 83
码表(19) = 84
码表(20) = 85
码表(21) = 86
码表(22) = 87
码表(23) = 88
码表(24) = 89
码表(25) = 90
码表(26) = 97
码表(27) = 98
码表(28) = 99
码表(29) = 100
码表(30) = 101
码表(31) = 102
码表(32) = 103
码表(33) = 104
码表(34) = 105
码表(35) = 106
码表(36) = 107
码表(37) = 108
码表(38) = 109
码表(39) = 110
码表(40) = 111
码表(41) = 112
码表(42) = 113
码表(43) = 114
码表(44) = 115
码表(45) = 116
码表(46) = 117
码表(47) = 118
码表(48) = 119
码表(49) = 120
码表(50) = 121
码表(51) = 122
码表(52) = 48
码表(53) = 49
码表(54) = 50
码表(55) = 51
码表(56) = 52
码表(57) = 53
码表(58) = 54
码表(59) = 55
码表(60) = 56
码表(61) = 57
码表(62) = 43
码表(63) = 47
三字节数据 (0) = 1
三字节数据 (1) = 2
三字节数据 (2) = 3
k = 0
判断循环首 k < len_y
结果 = 合并字节集(结果 , 结果扩充)
k = k + 1
判断循环尾
变量循环首 k = 1 至 len_x 步进 3
三字节数据 (1 - 1) = 原文 (k - 1)
三字节数据 (2 - 1) = 原文 (k + 1 - 1)
三字节数据 (3 - 1) = 原文 (k + 2 - 1)
结果 (i - 1) = 码表 (位右移 (三字节数据 (1 - 1), 2) + 1 - 1)
结果 (i + 1 - 1) = 码表 (位左移 (位与 (三字节数据 (1 - 1), 3), 4) + 位右移 (三字节数据 (2 - 1), 4) + 1 - 1)
结果 (i + 2 - 1) = 码表 (位左移 (位与 (三字节数据 (2 - 1), 15), 2) + 位右移 (三字节数据 (3 - 1), 6) + 1 - 1)
结果 (i + 3 - 1) = 码表 (位与 (三字节数据 (3 - 1), 63) + 1 - 1)
i = i + 4
变量循环尾
如果 (余数 = 1) 则
结果 (len_y - 1) = 61
结果 (len_y - 2) = 61
否则如果 (余数 = 2) 则
结果 (len_y - 1) = 61
结束 如果
'迅雷编码 = "
㈧ Java中用Base64编程的文件批量加密解密工具程序代码
/** * BASE64解密 * * @param key * @return * @throws Exception */
public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 * * @param key * @return * @throws Exception */ public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); }
㈨ 01加密方式-Base64编码
说明
HTTP将Base64编码用于基本的认证和摘要认证。
其可以方便的将用户的任何输入转换成只包含特定字符的安全格式,服务于网络通信过程。
特点
1)可以将任意的二进制数据进行Base64编码。
2)所有的数据都能被编码为并只用65个字符就能表示的文本文件。
3)编码后的65个字符包括A Z,a z,0~9,+,/,=
4)对文件或字符串进行Base64编码后将比 原始大小增加33% 。
5)能够逆运算
6)不够安全,但却被很多加密算法作为编码方式
1)将所有字符转化为ASCII码;
2)将ASCII码转化为8位二进制;
3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
b.数据不足3byte的话,则剩下的bit用0补足。每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c.不断进行,直到全部输入数据转换完成。
d.如果最后剩下两个输入数据,在编码结果后加1个“=”;
e.如果最后剩下一个输入数据,编码结果后加2个“=”;
f.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
运行效果图
㈩ base64编解码与hash加密
利用base64可以将二进制数据编码为64个字符组成的字符串,64个字符为a-z,A-Z,0-9,+,/。base64编码是将三个字节的二进制数据编码为四个字节的字符数据,如果字节数不为3的倍数base64会将 \x00 补在末尾,所以会常在base64字符串的末尾见到一个或者两个的 = 号。
base64编码
base64解码
小技巧:遇到base64编码的二进制文件可以直接解码用io字节流接收再用其他模块加载,无需在本地保存文件再使用其他模块加载。
哈希加密是对字符串进行加密,其加密后的散列值不可逆,即hash加密是单向加密不可解。python内置的hashlib库提供了md5, SHA1, SHA224, SHA256, SHA384, SHA512 加密算法的支持