小程序:JS AES加密解密(ECBCBC)

小程序:JS AES加密解密(ECBCBC),第1张

序言:介绍一下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算法原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10119276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存