aescrypt的确是一个文件加密的软件,它可以运行在多个操作系统上,比如windows,linux什么的。同时它采用的是业界通用的AES加密算法。
举例,如果你在windows上用的话,之需要右键点击一下文件,然后选择AES加密/解密,同时输入密码就好了。挺简单的。
有界面,我这里有个,但是是c#语言的,你以为如何?
下面是c版本的
AES加密算法源代码
//AES.h
#define decrypt TRUE
#define encrypt FALSE
#define TYPE BOOL
typedef struct _AES{
int Nb;
int Nr;
int Nk;
unsigned long *Word;
unsigned long *State;
}AES;
/*
加密数据
byte *input 明文
byte *inSize 明文长
byte *out 密文存放的地方
byte *key 密钥key
byte *keySize 密钥长
*/
void Cipher(
unsigned char* input,
int inSize,
unsigned char* out,
unsigned char* key,
int keySize);
/*
解密数据
byte *input 密文
int *inSize 密文长
byte *out 明文存放的地方
byte *key 密钥key
int *keySize 密钥长
*/
void InvCipher(
unsigned char* input,
int inSize,
unsigned char* out,
unsigned char* key,
int keySize);
/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
unsigned long 属性(标实类型)
返回AES结构指针
*/
AES *InitAES(AES *aes,
int inSize,
unsigned char* key,
int keySize, TYPE type);
/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
返回AES结构指针
*/
AES *InitAES(
int inSize,
unsigned char* key,
int keySize, BOOL );
/*
加密时进行Nr轮运算
AES * aes 运行时参数
*/
void CipherLoop(
AES *aes);
/*
解密时进行Nr轮逆运算
AES * aes 运行时参数
*/
void InvCipherLoop(
AES *aes);
/*
释放AES结构和State和密钥库word
*/
void freeAES(
AES *aes);
//AES.cpp
#include "stdafx.h"
#include
#include
#include "AES.h"
unsigned char* SubWord(unsigned char* word);
unsigned long* keyExpansion(unsigned char* key, int Nk, int Nr,int);
/*
加密数据
byte *input 明文
byte *inSize 明文长
byte *out 密文存放的地方
byte *key 密钥key
byte *keySize 密钥长
*/
void Cipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)
{
AES aes ;
InitAES(aes,inSize,key,keySize,encrypt);
memcpy(aes.State,input,inSize);
CipherLoop(aes);
memcpy(out,aes.State,inSize);
}
/*
解密数据
byte *input 密文
int *inSize 密文长
byte *out 明文存放的地方
byte *key 密钥key
int *keySize 密钥长
*/
void InvCipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)
{
AES aes;
InitAES(aes,inSize,key,keySize,decrypt);
memcpy(aes.State,input,inSize);
InvCipherLoop(aes);
memcpy(aes.State,out,inSize);
}
/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
返回AES结构指针
*/
AES *InitAES(AES *aes,int inSize, unsigned char *key, int keySize, TYPE type)
{
int Nb = inSize 2,
Nk = keySize 2,
Nr = Nb Nk ? Nk:Nb+6;
aes-Nb = Nb;
aes-Nk = Nk;
aes-Nr = Nr;
aes-Word = keyExpansion(key,Nb,Nr,Nk);
aes-State = new unsigned long[Nb+3];
if(type)
aes-State += 3;
return aes;
}
/*
生成加密用的参数AES结构
int inSize 块大小
byte* 密钥
int 密钥长
返回AES结构指针
*/
AES *InitAES(int inSize, unsigned char* key, int keySize,unsigned long type)
{
return InitAES(new AES(),inSize,key,keySize,type);
}
/*
*/
void CipherLoop(AES *aes)
{
unsigned char temp[4];
unsigned long *word8 = aes-Word,
*State = aes-State;
int Nb = aes-Nb,
Nr = aes-Nr;
int r;
for (r = 0; r Nb; ++r)
{
State[r] ^= word8[r];
}
for (int round =1; round {
word8 += Nb;
/*
假设Nb=4;
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | s7 |
---------------------
| s8 | s9 | sa | sb |
---------------------
| sc | sd | se | sf |
---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------
*/
memcpy(State+Nb,State,12);
/*
Nb=4;
---------------------
| s0 | | | |
---------------------
| s4 | s5 | | |
---------------------
| s8 | s9 | sa | |
---------------------
| sc | sd | se | sf |
---------------------
| | s1 | s2 | s3 |
---------------------
| | | s6 | s7 |
---------------------
| | | | sb |
---------------------
*/
for(r =0; r {
/*
temp = {Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};
*/
temp[0] = Sbox[*((unsigned char*)State)];
temp[1] = Sbox[*((unsigned char*)(State+1)+1)];
temp[2] = Sbox[*((unsigned char*)(State+2)+2)];
temp[3] = Sbox[*((unsigned char*)(State+3)+3)];
*((unsigned char*)State) = Log_02[temp[0]] ^ Log_03[temp[1]] ^ temp[2] ^ temp[3];
*((unsigned char*)State+1) = Log_02[temp[1]] ^ Log_03[temp[2]] ^ temp[3] ^ temp[0];
*((unsigned char*)State+2) = Log_02[temp[2]] ^ Log_03[temp[3]] ^ temp[0] ^ temp[1];
*((unsigned char*)State+3) = Log_02[temp[3]] ^ Log_03[temp[0]] ^ temp[1] ^ temp[2];
*State ^= word8[r];
State++;
}
State -= Nb;
}
memcpy(State+Nb,State,12);
word8 += Nb;
for(r =0; r {
*((unsigned char*)State) = Sbox[*(unsigned char*)State];
*((unsigned char*)State+1) = Sbox[*((unsigned char*)(State+1)+1)];
*((unsigned char*)State+2) = Sbox[*((unsigned char*)(State+2)+2)];
*((unsigned char*)State+3) = Sbox[*((unsigned char*)(State+3)+3)];
*State ^= word8[r];
State++;
}
}
/*
解密时进行Nr轮逆运算
AES * aes 运行时参数
*/
void InvCipherLoop(AES *aes)
{
unsigned long *Word = aes-Word,
*State = aes-State;
int Nb = aes-Nb,
Nr = aes-Nr;
unsigned char temp[4];
int r =0;
Word += Nb*Nr;
for (r = 0; r Nb; ++r)
{
State[r] ^= Word[r];
}
State -= 3;
for (int round = Nr-1; round 0; --round)
{
/*
假设Nb=4;
---------------------
| | | | |
---------------------
| | | | |
---------------------
| | | | |
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | s7 |
---------------------
| s8 | s9 | sa | sb |
---------------------
| sc | sd | se | sf |
---------------------
*/
memcpy(State,State+Nb,12);
/*
Nb=4;
---------------------
| | | | s7 |
---------------------
| | | sa | sb |
---------------------
| | sd | se | sf |
---------------------
| s0 | s1 | s2 | s3 |
---------------------
| s4 | s5 | s6 | |
---------------------
| s8 | s9 | | |
---------------------
| sc | | | |
---------------------
*/
Word -= Nb;
State += Nb+2;
for(r = Nb-1; r = 0; r--)
{
/*
temp = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};
*/
temp[0] = iSbox[*(byte*)State];
temp[1] = iSbox[*((byte*)(State-1)+1)];
temp[2] = iSbox[*((byte*)(State-2)+2)];
temp[3] = iSbox[*((byte*)(State-3)+3)];
*(unsigned long*)temp ^= Word[r];
*(unsigned char*)State = Log_0e[temp[0]] ^ Log_0b[temp[1]] ^ Log_0d[temp[2]] ^ Log_09[temp[3]];
*((unsigned char*)State+1) = Log_0e[temp[1]] ^ Log_0b[temp[2]] ^ Log_0d[temp[3]] ^ Log_09[temp[0]];
*((unsigned char*)State+2) = Log_0e[temp[2]] ^ Log_0b[temp[3]] ^ Log_0d[temp[0]] ^ Log_09[temp[1]];
*((unsigned char*)State+3) = Log_0e[temp[3]] ^ Log_0b[temp[0]] ^ Log_0d[temp[1]] ^ Log_09[temp[2]];
State --;
}
State -= 2;
}
Word -= Nb;
memcpy(State,State+Nb,12);
State += Nb+2;
for(r = Nb-1; r = 0; r--)
{
*(unsigned char*)State = iSbox[*(unsigned char*)State];
*((unsigned char*)State+1) = iSbox[*((unsigned char*)(State-1)+1)];
*((unsigned char*)State+2) = iSbox[*((unsigned char*)(State-2)+2)];
*((unsigned char*)State+3) = iSbox[*((unsigned char*)(State-3)+3)];
*State ^= Word[r];
State --;
}
}
/*
*--------------------------------------------
*|k0|k1|k2|k3|k4|k5|k6|k7|k8|k9|.......|Nk*4|
*--------------------------------------------
*Nr轮密钥库
*每个密钥列长度为Nb
*---------------------
*| k0 | k1 | k2 | k3 |
*---------------------
*| k4 | k5 | k6 | k7 |
*---------------------
*| k8 | k9 | ka | kb |
*---------------------
*| kc | kd | ke | kf |
*---------------------
*/
unsigned long* keyExpansion(byte* key, int Nb, int Nr, int Nk)
{
unsigned long *w =new unsigned long[Nb * (Nr+1)]; // 4 columns of bytes corresponds to a word
memcpy(w,key,Nk2);
unsigned long temp;
for (int c = Nk; c Nb * (Nr+1); ++c)
{
//把上一轮的最后一行放入temp
temp = w[c-1];
//判断是不是每一轮密钥的第一行
if (c % Nk == 0)
{
//左旋8位
temp = (temp8)|(temp24);
//查Sbox表
SubWord((byte*)temp);
temp ^= Rcon[c/Nk];
}
else if ( Nk 6 (c % Nk == 4) )
{
SubWord((byte*)temp);
}
//w[c-Nk] 为上一轮密钥的第一行
w[c] = w[c-Nk] ^ temp;
}
return w;
}
unsigned char* SubWord(unsigned char* word)
{
word[0] = Sbox[ word[0] ];
word[1] = Sbox[ word[1] ];
word[2] = Sbox[ word[2] ];
word[3] = Sbox[ word[3] ];
return word;
}
/*
释放AES结构和State和密钥库word
*/
void freeAES(AES *aes)
{
// for(int i=0;iNb;i++)
// {
// printf("%d\n",i);
// free(aes-State[i]);
// free(aes-Word[i]);
// }
// printf("sdffd");
}
因项目需要用到加解密,然后研究了下flutter大部分是用原生实现加解密的,但是这样不是我想要的,后面找资料发现dart有一个加密工具 encrypt 。然后研究了下,可以实现我们大部分加解密。
使用Dart实现加解密,有对称加密AES,非对称加密RSA。
工具类封装了AES加解密,RSA加解密和数字签名,RSA也实现分段加解密。
一、导包
二、工具类
总体来说配置比较简单,跟着官网的说明做就ok。官方连接: 。这里面值得注意的是,kube-apisever的加密插件配置参数为 --encryption-provider-config ,在1.13版本之前是 --experimental-encryption-provider-config ,该参数在1.14版本之后已经被正式废弃。
配置文件示例:
其中 resources 可以是多组独立的配置,每组配置下定义了该组资源的加解密的策略,比如这个配置文件定义了secrets资源的加解密策略。 providers 定义了加解密的实际提供者,目前k8支持的provider如下所示:
其中identity就是明文,不加密。其余就是各类加解密算法,建议使用 aescbc ,足够用了,其实就是使用CBC模式、PKCS#7填充的aes256加密。这里要注意的是,providers中可以设置多个加密 provider ,每个 provider 可以设置多个加密的密钥。
到这里按照常规流程你一定想 kubectl create -f 来创建这个资源了,如果你这么做了,不出意外的话会看到如下的报错:
这是因为, kube-apiserver的相关资源,是不能通过kubectl命令来创建的 ,官方文档并没有明确说明,其实也很好理解,自己怎么创建自己嘛!这个资源,只能是通过配置启动参数在kube-apisever启动的时候来加载。这边我使用kubeadm安装的集群,配置文件位置在 /etc/kubernetes/manifests ,找到 kube-apiserver.yaml ,这个就是kube-apiserver启动用的配置文件(用其他方式安装的也类似,只要找到这个配置文件就可以)。所以说这个加密插件的启动,目前来说貌似只能在私有集群中实现,如果你用的是gke、ake、tke这样的云服务商提供的集群就不行了。
我们在这个配置文件中加入如下信息:
其中 encryption-provider-config 就是配置插件插件启动时读取的配置文件所在位置,这边我们把前面写的配置文件命名为 encrypt.conf ,放在 /etc/kubernetes/pki 目录下,通过阅读配置文件,我们可以看到kube-apiserver在启动的时候会挂载三个宿主机目录,其中就有 /etc/kubernetes/pki 。所以你把配置文件放在这里,kube-apiserver启动的时候就能正确找到这个配置文件了。
kube-apisever重启后,我们就可以尝试一下,看看加密功能是否生效。这里我们用到的配置文件如下:
这个配置保证了我们新建的secrets资源都会默认使用 aescbc 加密算法,并且使用key1中定义的这个密钥来加密数据。注意 identity 这个参数必须要设置,否则所有我们之前建立的secrets都会无法访问。具体原因其实上面已经讲过,大家可以想一下为什么。
现在我们来新建一个serctes资源来验证一下
之后登陆入容器etcd中
执行etcdctl命令查看刚才建立的secret1密钥的内容,这里要注意的是etcd默认的api版本是v2,k8默认使用的版本是v3,两者互不兼容,所以在执行的时候需要在命令前显式的加上 ETCDCTL_API=3 来告诉etcdctl我要调用的是v3 api,或者使用环境变量export指定也可以。由于v3默认开启了ssl认证,所以在调用的时候还需要加上连接认证信息,这部分内容可以在 etcd.yaml 的 livenessProbe 这个配置中查看到,把这条命令复制出来,后面加上secret1的路径,就可以查看到secret内容了
注意在数据头部出现 k8s:enc:aescbc:v1: ,说明数据已经被正确加密,使用的是 aescbc 算法,使用的密钥为 key1 。
接下来我们看下kube-apiserver在读取的时候是否正确解密了,执行下面的命令
得到 mykey 的base64编码数据 bXlkYXRh ,将其decode一下
没错,正是我们设置的sercets机密数据,试验成功!
通过kubernetes提供的加密插件,使得etcd中存放的secrets数据都以密文的形式存放,这无异大大提高了数据安全性。但是要明确一点, 加密插件只是加密了etcd中保存的数据 ,这意味着你执行 kubectl get secrets mysecret -o yaml 这样的命令看到的仍然是明文,在容器内部注入的secrets文件或者环境变量看到的也是明文,原因当然是kube-apiserver在从etcd中取出数据的时候已经帮你自动解密了。如果你有全程加密的需求(比如说想在容器内看到的也是密文),这显然是kubernetes这种平台层的工具做不到的,因为这已经涉及到了应用的改造。
其实就目前的实际使用场景看, 如果你有将etcd直接暴露给集群内第三方服务使用或者直接暴露给外部服务使用的需求 (一般非常少),那么你最好使用加密插件,否则会面临机密数据泄漏的风险。而如果etcd仅供k8s的系统组件来使用的话,由于kubernetes本身已经有比较完善的rbac机制,那么你只要做好kube-apiserver的权限管理即可,例如:
那么其实也未必需要加密,k8s默认提供的secrets策略已经完全能够满足要求(毕竟你即使在etcd中加密了,有kubectl权限的和有访问secrets权限的账号还是可以看到明文)。
接下去两篇文章我们主要介绍安全分析过程中burp抓包完解密 经过加密的请求数据 ,并在新建的消息编辑器中打印输出。这篇文章主要先介绍测试app中加解密算法的分析与还原。
一、分析请求数据的加密算法
结果如下所示
二、还原加密算法并测试
在下一篇文章中,将介绍app请求数据解密插件的编写。该篇文章分析中用到frida脚本与还原后的算法,如果有需要,可以在公众号回复" AES Decrypt1 "获取。
这个我不清楚。
文件夹加密软件,我使用的是文件夹加密超级大师。
文件夹加密超级大师支持所有windows系统,可以加密文件夹,加密文件,保护磁盘和数据粉碎,使用起来非常方便。
在需要加密的文件和文件夹上单击鼠标右键选择加密就可以了。
解密时只要双击加密的文件夹和文件,输入正确的密码就可以解密。
文件夹加密超级大师加密后的文件和文件夹可以防止删除、复制和移动。
相对于其他的文件夹加密软件和文件加密软件,功能和性能还有操作都更加的出色。
并且有微软、360和金山的安全认证,是一款绝对安全的文件夹加密软件。
您可以到百度上下载文件夹加密超级大师来给您的文件和文件夹加密,看看使用效果怎么样?