序言:介绍一下javascript下AES加密和解密,运用的工作模式为ECB(电码本模式Electronic Codebook Book),填充方式为(NoPadding),及CBC(密码分组链接模式Cipher Block Chaining)。这里用到的是CryptoJS。
,也分别为128比特,192比特和256比特,并分别被称为AES-128,AES-192,AES-256。
AES和传统的分组密码算法不同的是它不采用Feistel结构(比如DES中采用的),而是采用了三个不同的可逆一致变换层:线性混合层、非线性层、密钥加层。具体的算法数学基础和过程请祥见: >
AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个
元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,
各轮AES加密循环(除最后一轮外)均包含4个步骤:
矩阵中的各字节通过一个8位的S-box进行转换。这个步骤提供了加密法非线性的变换能力。S-box与GF(28)上的乘法反元素有关,已知具有良好的非线性特性。为了避免简单代数性质的攻击,S-box结合了乘法反元素及一个可逆的仿射变换矩阵建构而成。此外在建构S-box时,刻意避开了固定点与反固定点,即以S-box替换字节的结果会相当于错排的结果。AES算法中的S盒如图22所示
例如一个字节为0x19,经过S盒变换查找n(1,9) = 0xd4,所以就替换为0xd4。
ShiftRows描述矩阵的行 *** 作。在此步骤中,每一行都向左循环位移某偏移量。在AES中(区块大小128位),第一行维持不变,第二行里的每个字节都向左循环移动一格。同理,第三行及第四行向左循环位移的偏移量就分别是2和3。经过ShiftRows之后,矩阵中每一竖列,都是由输入矩阵中的每个不同列中的元素组成。
在MixColumns步骤,每一列的四个字节通过线性变换互相结合。每一列的四个元素分别当作 的系数,合并即为GF(28)中的一个多项式,接着将此多项式和一个固定的多项式在modulo 下相乘。此步骤亦可视为Rijndael有限域之下的矩阵乘法。MixColumns函数接受4个字节的输入,输出4个字节,每一个输入的字节都会对输出的四个字节造成影响。因此ShiftRows和MixColumns两步骤为这个密码系统提供了扩散性。
AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。它涉及如下三个模块:
(1)位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];
(2)S盒变换(subword)——对一个4字节进行S盒代替;
(3)变换Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。这里的x是(02),如 Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……
扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[[i]]=W[[i-1]]W[[i- Nk]]。但是若i为Nk的倍数,则W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。
上面是暴利破解,你也查看下AES加密原理给你提供一段C的AES////////////////////////////////////////////////////////////////////#include <stdioh>
#include <windowsh>
#include "md5cc"
#include "resourceh"
#include "miraclh"
#include "mirdefh"#pragma comment( lib, "ms32lib")
/-------------------------------------------------------------/
/ 定义子程序与全局变量、常量 /
/-------------------------------------------------------------/
HINSTANCE hInst;
TCHAR szConstName[]="pediy";
#define MAXINPUTLEN 200/-------------------------------------------------------------/
/ 函数声明 /
/-------------------------------------------------------------/
BOOL CALLBACK MainDlg (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL GenerateSerial( HWND) ;/-------------------------------------------------------------/
/ WinMain - 基于WIN32的程序的入口 /
/-------------------------------------------------------------/int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
hInst=hInstance;
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)MainDlg,0);
return 0;
}/-------------------------------------------------------------/
/ AboutDlgProc - 关于窗口 /
/-------------------------------------------------------------/BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONDOWN:
PostMessage(hDlg, WM_NCLBUTTONDOWN, HTCAPTION, 0);
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
case IDCANCEL :
EndDialog (hDlg, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}
/-------------------------------------------------------------/
/ MainDlg - 主对话窗口 /
/-------------------------------------------------------------/
BOOL CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{ switch (message)
{
case WM_CLOSE:
EndDialog(hDlg,0);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_Name:
GenerateSerial(hDlg);
break; case IDC_About :
DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUT), hDlg, AboutDlgProc) ;
break; case IDC_Exit:
PostQuitMessage(0);
}
break;
case WM_INITDIALOG:
SendMessage(hDlg,WM_SETICON,(WPARAM) 1,(LPARAM) LoadIconA(hInst,MAKEINTRESOURCE(IDI_ICON)));
SendDlgItemMessage(hDlg,IDC_Name,WM_SETTEXT,0,(LPARAM)szConstName);
break;
}
return 0;
}BOOL GenerateSerial(HWND hWnd)
{
MD5_CTX context;
aes aes_test;
long dtLength;
int i;
TCHAR szName[MAXINPUTLEN]={0};
TCHAR szHash[MAXINPUTLEN]={0};
BYTE szKey[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c};
TCHAR szSerial[33]={0};
dtLength=GetDlgItemText(hWnd, IDC_Name, szName, sizeof(szName)/sizeof(TCHAR)+1);
if (dtLength==0)
{
SetDlgItemText(hWnd, IDC_Serial, "please input name");
return FALSE;
}
MD5Init(&context);
MD5Update(&context, szName, dtLength);
MD5Final(szHash, &context);
aes_init(&aes_test,MR_ECB,16,szKey,NULL);
aes_decrypt(&aes_test,szHash);
for (i=0;i<16;i++)
{
sprintf((szSerial+i2),"%02X",(BYTE)szHash[i]);
}
SetDlgItemText(hWnd, IDC_Serial,szSerial); return TRUE;
}
如果你无法分析出来,可以把关键地方爆破
就不给定义了,我简单解释下,就是我的信息不想让别人知道,使用 秘钥(key) 对我的信息进行 加密(encrypt) ,变成鬼符一样的 秘文(ciphertext) 。别人就算看到了,也无法识别,只有有了秘钥,把秘文 解密(decrypt) 后才能看懂信息,秘钥呢?一般人我不告诉他。我的秘钥是私密信息,所以也叫 私钥(private key) ,加密和解密用的秘钥是相同的,所以叫 “对称加密” ,也叫 “私钥加密” 。
对于明文plaintext,和对称秘钥key
加密过程 E(plaintext, key) = ciphertext
解密过程 D(ciphertext, key) = plaintext
对称加密的分为 分组密码(block cipher) 和 流密码(stream cipher) 两种类型。本文只介绍分组密码。
分组密码是每次只能处理特定长度的一块(block)数据的一类加解密算法。AES就是一种分组密码算法。AES加密算法每次可以加密的块长度是128位(bit)。
ECB模式
使用AES加密算法ECB模式,每次能加密128位数据,即16个字节。如果要加密48个字节内容,我们需要把数据分为3组,每组16个字节,分别为P1、P2、P3。P1、P2、P3加密后形成的秘文分别为C1、C2、C3,我们把C1、C2、C3依次拼接起来就成为最终的加密结果。
CBC模式
《对称加密之对称加密二》正在写作,会包含分组密码的更多模式,流密码及AES的更多知识。
DES加密:旧的加密算法,NIST规定仅能用于遗留系统和TDEA。(参考文献[CNS] 32章)
TDEA(Triple DEA)加密:很多资料也叫3DES(Triple DES)。(参考文献[SP800-67])
Python 可以使用 pycrypto 模块进行AES加解密。安装 pycrypto 可使用命令 pip install pycrypto 安装。
下面AES演示第一版,先看下,紧接着就会升级到第二版本。
运行一下,能正常加解密。但是,如果你把要加密的文本,从 aesAlgorithmDemo 改为 hello ,就会运行报错:
这是因为,AES的分组长度是128位,即16个字节。有些AES实现,要加密的消息长度不是16个字节的倍数需要填充。
填充的方法一般是按照PKCS#7填充标准。
如果要数据的长度不是分组的整数倍,需要填充数据到分组的倍数,如果数据的长度是分组的倍数,需要填充分组长度的数据,填充的每个字节值为填充的长度。PKCS#7支持的分组长度为1到255个字节。
举一些例子:
AES的分组长度为16个字节,不管秘钥是128位、192位还是256位。如果要加密的数据长度是5个字节,你需要填充11个字节,填充的内容位填充的长度0x0b。填充后类似下面表示
如果数据长度是30个字节,需要填充2个字节,每个字节的内容为0x02,如果数据成都恰好为16的倍数,需要填充16个字节,每个字节的内容为0x10。
弄明白填充的概念后,我们重写加解密函数如下:
这样填充后会不会可其它系统不兼容?不会。一般的AES程序都是支持PKCS#7填充的。
密码学基础之RSA与不对称秘钥
密码学基础系列
[CNS] 《密码编码学与网络安全》(第六版)
[SP800-67] NIST Special Publication 800-67 Revision 1, Recommendation for Triple Data Encryption Algorithm (TDEA) Block Cipher, January 2012
[SSH] OpenSSH CBC模式信息泄露漏洞
[NIST SP 800-57 Part 1 Rev 4] Recommendation for Key Management, Part 1: General
以上就是关于小程序:JS AES加密解密(ECB/CBC)全部的内容,包括:小程序:JS AES加密解密(ECB/CBC)、有没有aes的教程,加密解密的、AES算法原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)