173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

简易加密算法

keros@mark 2022-11-07 资讯中心

很高兴和大家一起分享简易加密算法的知识,希望对各位有所帮助。

本文目录一览

RSA加密算法简易演示

RSA算法安全性本质是三大数学困难问题之一也就是大数分解问题,因为目前尚没有一种有效的方法可以在短时间内分解两个大素数的乘积。验证步骤如上面所说的,原理书上有,具体程序实现简单讲一下

判断质数,这是基本水平,可以穷举也可以建表,按自己喜好

这一步是计算两个大素数乘积没什么好说的

判断两个数互质,一般采用欧几里得算法,辗转相除直到得到gcd(e1,m)=1。当然你也可以穷举公因数一直到sqrt(min{e1,m})

计算乘法逆元是依靠广义欧几里得算法,乘法逆元的意思是形如a*a1 ≡ 1(mod m)这样的(因为这里的群的乘法定义就是数学乘法),a和a1互为彼此模m的逆元,记作a1=a^-1 mod m,只有gcd(a,m)=1时才有唯一解否则无解。

计算方法是广义欧几里得除法,设r0=m,r1=a,s0=1,s1=0,t0=0,t1=1;

计算ai=[r(i-1)/ri],r(i+1)=r(i-1)-airi,s(i+1)=s(i-1)-aisi,t(i+1)=t(i-1)-aiti,直到ri=0

举例如a=7,m=13,计算a^-1 mod m:

a1=[13/7]=1,r2=r0-a1r1=6,s2=s0-a1s1=1,t2=t0-a1t1=-1;

a2=[7/6]=1,r3=r1-a2r2=1,s3=s1-a2s2=-1,t3=t1-a2t2=2;

a3=[6/1]=6,r4=r2-a3r3=0.

取s=s3=-1,t=t3=2,则有7*2-1*13=1,故a^-1 mod m=t=2。

把上面的方法写成C++算法应该很简单

5和6都是计算同余没什么好说的,记得要用到a^e≡b^e(mod m)化简

要毕业了还搞不懂逆元有点拙计啊,回去好好看看离散数学吧

设计一个简单的数据加密算法

// ecfileDlg.cpp : implementation file

//

#include "stdafx.h"

#include "ecfile.h"

#include "ecfileDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CEcfileDlg dialog

CEcfileDlg::CEcfileDlg(CWnd* pParent /*=NULL*/)

: CDialog(CEcfileDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CEcfileDlg)

m_path = _T("");

m_pass = _T("");

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);

}

void CEcfileDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CEcfileDlg)

DDX_Text(pDX, IDC_PASSWORD, m_path);

DDX_Text(pDX, IDC_PASS1, m_pass);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CEcfileDlg, CDialog)

//{{AFX_MSG_MAP(CEcfileDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_E, OnE)

ON_BN_CLICKED(IDC_D, OnD)

ON_BN_CLICKED(IDC_BROW, OnBrow)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CEcfileDlg::OnInitDialog()

{

CDialog::OnInitDialog();

ASSERT((IDM_ABOUTBOX 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu-AppendMenu(MF_SEPARATOR);

pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

SetIcon(m_hIcon, TRUE);

SetIcon(m_hIcon, FALSE);

return TRUE;

}

void CEcfileDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

void CEcfileDlg::OnPaint()

{

CDialog::OnPaint();

}

HCURSOR CEcfileDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CEcfileDlg::OnE()

{

UpdateData(TRUE);

if(m_path == "")

{

AfxMessageBox("怎么没有选择要加密的文件就开始加密啊?");

return;

}

UpdateData(TRUE);

if(m_pass == "")

{

AfxMessageBox("没有写上密码");

return;

}

if(ecfile(m_path))

{

MessageBox("加密成功了已经");

}

else

{

MessageBox("没加密成功");

}

}

void CEcfileDlg::OnD()

{

UpdateData(TRUE);

if(m_path == "")

{

AfxMessageBox("怎么没有选择要加密的文件就开始解密啊?");

return;

}

UpdateData(TRUE);

if(m_pass == "")

{

AfxMessageBox("没有写上密码");

return;

}

if(dcfile(m_path))

{

MessageBox("解密成功了");

}

else

{

MessageBox("解密失败了");

}

}

void CEcfileDlg::OnBrow()

{

CFileDialog dlg(TRUE);

if(dlg.DoModal() == IDOK)

{

m_path = dlg.GetPathName();

UpdateData(FALSE);

}

else

{

return;

}

}

//给文件加密的函数

BOOL CEcfileDlg::ecfile(LPCTSTR fpath)

{

char *data;

CFile *file;

DWORD flen;

m_password = epass();

file = new CFile;

if ( !file-Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))

{

return FALSE;

}

flen = file-GetLength();

data = new char[(int)flen];

file-SeekToBegin();

file-Read(data, flen);

for(int i=0; i(int)flen; i++)

{

data[i] ^= m_password;

data[i] ^= flen;

}

file-SeekToBegin();

file-Write(data, flen);

delete[] data;

//添加密码验证信息

char cpass[5] = "love";

for(int j=0; j5; j++)

{

cpass[j] ^= m_password;

}

file-SeekToEnd();

file-Write(cpass, 5);

file-Close();

delete file;

return TRUE;

}

//给文件解密的函数

BOOL CEcfileDlg::dcfile(LPCTSTR fpath)

{

char *data;

CFile *file;

DWORD flen;

char love[5];

file = new CFile;

if( !file-Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))

{

return FALSE;

}

flen = file-GetLength();

data = new char[(int)flen];

//检验密码是不是正确

file-Seek(-5, CFile::end);

file-Read(love, 5);

m_password = epass();

for(int i=0; i5; i++)

{

love[i] ^= m_password;

}

if(strcmp(love, "love")!=0)

{

return FALSE;

}

//解密

file-SeekToBegin();

file-Read(data, flen);

for(int j=0; j(int)flen; j++)

{

data[j] ^= m_password;

data[j] ^= (flen-5);

}

file-SeekToBegin();

file-Write(data, flen);

file-SetLength(flen-5);

file-Close();

delete[] data;

delete file;

return TRUE;

}

//获得密码的函数

__int64 CEcfileDlg::epass()

{

DWORD plen;

char *ppass;

__int64 mc= 8757735233305;

UpdateData(TRUE);

ppass = m_pass.GetBuffer(0);

plen = strlen(ppass);

for(int i=0; i(int)plen; i++)

{

mc ^= ppass[i]|128;

}

return mc;

}

用c语言设计一个简单地加密算,解密算法,并说明其中的原理

可能很长 ,这是在我以前一个程序里摘出来的。

原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的 ASCII码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的ascII码减一 在与你输入的密码比较,正确既可以进入。

#define CODE_SIZE 10

int password()

{

FILE *fp;

char s1[CODE_SIZE], s2[CODE_SIZE], s3[CODE_SIZE], fun;

while (1)

{

fp = fopen("password.txt", "r");

if (fp == NULL)

{

printf("第一次运行,请输入初始密码(最多8位):\n");

scanf("%s", s1);

printf("请再次输入初始密码:\n");

scanf("%s", s2);

if (strcmp(s1, s2) == 0)

{

fp = fopen("password.txt", "w+");

if (fp == NULL)

{

printf("创建文件失败退出\n");

getch();

exit(1);

}

else

{

//对s1加密

for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)

{

s1[i] = s1[i] + i;

}

fputs(s1, fp);

printf("初始密码创建完成.\n");

}

}

else

{

printf("两次输入的密码不一致!\n");

}

fclose(fp);

}

else

{

fgets(s1, CODE_SIZE, fp);

fclose(fp);

printf("输入密码:\n");

scanf("%s", s2);

//对s1解密

for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)

{

s1[i] = s1[i] - i;

}

loop:

if (strcmp(s1, s2) == 0)

{

printf("-----密码正确-----\n");

printf("-----请选择功能-----\n");

printf("-----1:修改密码-----\n");

printf("-----2:进入通讯录-----\n");

scanf("%d", fun);

switch (fun)

{

case 1: printf("请输入新密码\n");

scanf("%s", s1);

printf("请再次输入新密码\n");

scanf("%s", s2);

if (strcmp(s1, s2) == 0)

{

fp = fopen("password.txt", "w+");

if (fp == NULL)

{

printf("文件错误!\n");

}

else

{ //对s1加密

for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)

{

s1[i] = s1[i] + i;

}

fputs(s1, fp);

fclose(fp);

printf("密码修改成功\n");

}

}

else

{

printf("两次输入的密码不一致,修改失败\n");

}

break;

case 2: return 1;

default: printf("无效指令\n");

}

}

else

{

printf("密码错误\n请重新输入\n");

scanf("%s", s2);

goto loop;

}

}

printf("------------------\n\n\n\n");

}

}

串口通信简易加密算法的破解

可以.

如果算法很简单,找寻规律并不是很难.

如果复杂一些,可以试试一些常用的算法来解密.需要一些密码知识.

如果使用了密匙,不可逆算法等难以解密的方法,在短时间内是绝对不可能的了.

希望对你有所帮助!

谁帮我介绍下加密对称算法?

A.对称加密技术 a. 描述 对称算法(symmetric algorithm),有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的。所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。 b.特点分析 对称加密的优点在于算法实现后的效率高、速度快。 对称加密的缺点在于密钥的管理过于复杂。如果任何一对发送方和接收方都有他们各自商议的密钥的话,那么很明显,假设有N个用户进行对称加密通信,如果按照上述方法,则他们要产生N(N-1)把密钥,每一个用户要记住或保留N-1把密钥,当N很大时,记住是不可能的,而保留起来又会引起密钥泄漏可能性的增加。常用的对称加密算法有DES,DEA等。 B.非对称加密技术 a.描述 非对称加密(dissymmetrical encryption),有时又叫公开密钥算法(public key algorithm)。这种加密算法是这样设计的:用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之所以又叫做公开密钥算法是由于加密密钥可以公开,即陌生人可以得到它并用来加密信息,但只有用相应的解密密钥才能解密信息。在这种加密算法中,加密密钥被叫做公开密钥(public key),而解密密钥被叫做私有密钥(private key)。 b.特点分析 非对称加密的缺点在于算法实现后的效率低、速度慢。 非对称加密的优点在于用户不必记忆大量的提前商定好的密钥,因为发送方和接收方事先根本不必商定密钥,发放方只要可以得到可靠的接收方的公开密钥就可以给他发送信息了,而且即使双方根本互不相识。但为了保证可靠性,非对称加密算法需要一种与之相配合使用的公开密钥管理机制,这种公开密钥管理机制还要解决其他一些公开密钥所带来的问题。常用的非对称加密算法有RSA等。 (3) 关于密码技术 密码技术包括加密技术和密码分析技术,也即加密和解密技术两个方面。在一个新的加密算法的研发需要有相应的数学理论证明,证明这个算法的安全性有多高,同时还要从密码分析的角度对这个算法进行安全证明,说明这个算法对于所知的分析方法来说是有防范作用的。 三、对称加密算法分析 对称加密算法的分类 对称加密算法可以分成两类:一类为序列算法(stream algorithm):一次只对明文中单个位(有时为字节)加密或解密运算。另一类为分组算法(block algorithm):一次明文的一组固定长度的字节加密或解密运算。 现代计算机密码算法一般采用的都是分组算法,而且一般分组的长度为64位,之所以如此是由于这个长度大到足以防止分析破译,但又小到足以方便使用。 1.DES加密算法 (Data Encryption Standard )

(1) 算法简介

1973 年 5 月 15 日,美国国家标准局 (NBS) 在“联邦注册”上发布了一条通知,征求密码算法,用于在传输和存储期间保护数据。IBM 提交了一个候选算法,它是 IBM 内部开发的,名为 LUCIFER。在美国国家安全局 (NSA) 的“指导”下完成了算法评估之后,在 1977 年 7 月 15 日,NBS 采纳了 LUCIFER 算法的修正版作为新的数据加密标准。

原先规定使用10年,但由于新的加密标准还没有完成,所以DES算法及其的变形算法一直广泛的应用于信息加密方面。 (2) 算法描述 (包括加密和解密)

Feistel结构(画图说明)。

DES 的工作方式:可怕的细节

DES 将消息分成 64 位(即 16 个十六进制数)一组进行加密。DES 使用“密钥”进行加密,从符号的角度来看,“密钥”的长度是 16 个十六进制数(或 64 位)。但是,由于某些原因(可能是因为 NSA 给 NBS 的“指引”),DES 算法中每逢第 8 位就被忽略。这造成密钥的实际大小变成 56 位。编码系统对“强行”或“野蛮”攻击的抵抗力与其密钥空间或者系统可能有多少密钥有直接关系。使用的位数越多转换出的密钥也越多。密钥越多,就意味着强行攻击中计算密钥空间中可能的密钥范围所需的时间就越长。从总长度中切除 8 位就会在很大程度上限制了密钥空间,这样系统就更容易受到破坏。

DES 是块加密算法。这表示它处理特定大小的纯文本块(通常是 64 位),然后返回相同大小的密码块。这样,64 位(每位不是 0 就是 1)有 264 种可能排列,DES 将生成其中的一种排列。每个 64 位的块都被分成 L、R 左右两块,每块 32 位。

DES 算法使用以下步骤:

1. 创建 16 个子密钥,每个长度是 48 位。根据指定的顺序或“表”置换 64 位的密钥。如果表中的第一项是 "27",这表示原始密钥 K 中的第 27 位将变成置换后的密钥 K+ 的第一位。如果表的第二项是 36,则这表示原始密钥中的第 36 位将变成置换后密钥的第二位,以此类推。这是一个线性替换方法,它创建了一种线性排列。置换后的密钥中只出现了原始密钥中的 56 位。

2. 接着,将这个密钥分成左右两半,C0 和 D0,每一半 28 位。定义了 C0 和 D0 之后,创建 16 个 Cn 和 Dn 块,其中 1=n=16。每一对 Cn 和 Dn 块都通过使用标识“左移位”的表分别从前一对 Cn-1 和 Dn-1 形成,n = 1, 2, ..., 16,而“左移位”表说明了要对哪一位进行操作。在所有情况下,单一左移位表示这些位轮流向左移动一个位置。在一次左移位之后,28 个位置中的这些位分别是以前的第 2、3……28 位。

通过将另一个置换表应用于每一个 CnDn 连接对,从而形成密钥 Kn,1=n=16。每一对有 56 位,而置换表只使用其中的 48 位,因为每逢第 8 位都将被忽略。

3. 编码每个 64 位的数据块。

64 位的消息数据 M 有一个初始置换 IP。这将根据置换表重新排列这些位,置换表中的项按这些位的初始顺序描述了它们新的排列。我们以前见过这种线性表结构。

使用函数 f 来生成一个 32 位的块,函数 f 对两个块进行操作,一个是 32 位的数据块,一个是 48 位的密钥 Kn,连续迭代 16 次,其中 1=n=16。用 + 表示 XOR 加法(逐位相加,模除 2)。然后,n 从 1 到 16,计算 Ln = Rn-1 Rn = Ln-1 + f(Rn-1,Kn)。即在每次迭代中,我们用前一结果的右边 32 位,并使它们成为当前步骤中的左边 32 位。对于当前步骤中的右边 32 位,我们用算法 f XOR 前一步骤中的左边 32 位。

要计算 f,首先将每一块 Rn-1 从 32 位扩展到 48 位。可以使用选择表来重复 Rn-1 中的一些位来完成这一操作。这个选择表的使用就成了函数 f。因此 f(Rn-1) 的输入块是 32 位,输出块是 48 位。f 的输出是 48 位,写成 8 块,每块 6 位,这是通过根据已知表按顺序选择输入中的位来实现的。

我们已经使用选择表将 Rn-1 从 32 位扩展成 48 位,并将结果 XOR 密钥 Kn。现在有 48 位,或者是 8 组,每组 6 位。每组中的 6 位现在将经历一次变换,该变换是算法的核心部分:在叫做“S 盒”的表中,我们将这些位当作地址使用。每组 6 位在不同的 S 盒中表示不同的地址。该地址中是一个 4 位数字,它将替换原来的 6 位。最终结果是 8 组,每组 6 位变换成 8 组,每组 4 位(S 盒的 4 位输出),总共 32 位。

f 计算的最后阶段是对 S 盒输出执行置换 P,以得到 f 的最终值。f 的形式是 f = P(S1(B1)S2(B2)...S8(B8))。置换 P 根据 32 位输入,在以上的过程中通过置换输入块中的位,生成 32 位输出。

解密只是加密的逆过程,使用以上相同的步骤,但要逆转应用子密钥的顺序。DES 算法是可逆的

(2) 算法的安全性分析

在知道一些明文和密文分组的条件下,从理论上讲很容易知道对DES进行一次穷举攻击的复杂程度:密钥的长度是56位,所以会有 种的可能的密钥。

在1993年的一年一度的世界密码大会上,加拿大北方电信公司贝尔实验室的 Michael Wiener 描述了如何构造一台专用的机器破译DES,该机器利用一种每秒能搜索5000万个密钥的专用芯片。而且此机器的扩展性很好,投入的经费越多则效率越高。用100万美元构造的机器平均3.5小时就可以破译密码。

如果不用专用的机器,破译DES也有其他的方法。在1994年的世界密码大会上,M.Matsui 提出一种攻克DES的新方法--"线性密码分析"法。它可使用平均 个明文及其密文,在12台HP9000/735工作站上用此方法的软件实现,花费50天时间完成对DES的攻击。

如前所述DES作为加密算法的标准已经二十多年了,可以说是一个很老的算法,而在新的加密算法的国际标准出现之前,许多DES的加固性改进算法仍有实用价值,在本文的3.4节详细的描述,同时考虑的以上所述DES的安全性已受到了威胁。

(4) 算法的变体 三重DES(TDEA),使用3个密钥,执行3次DES算法:

加密:C = Ek3[Dk2[Ek1[P]]] 解密:P = Dk1[Ek2[Dk3[C]]]

特点:安全性得到增强,但是速度变慢。

2.aes

自 20 世纪 70 年代以来一直广泛使用的“数据加密标准”(DES) 日益显出衰老的痕迹,而一种新的算法 -- Rijndael -- 正顺利地逐渐变成新标准。这里,Larry Loeb 详细说明了每一种算法,并提供了关于为什么会发生这种变化的内幕信息。

DES 算法是全世界最广泛使用的加密算法。最近,就在 2000 年 10 月,它在其初期就取得的硬件方面的优势已经阻碍了其发展,作为政府加密技术的基础,它已由“高级加密标准”(aes) 中包含的另一种加密算法代替了。aes 是指定的标准密码系统,未来将由政府和银行业用户使用。aes 用来实际编码数据的加密算法与以前的 DES 标准不同。我们将讨论这是如何发生的,以及 aes 中的 Rijndael 算法是如何取代 DES 的算法的。

“高级加密标准”成就

但直到 1997 年,美国国家标准技术局 (NIST) 才开始打着 aes 项目的旗帜征集其接任者。1997 年 4 月的一个 aes 研讨会宣布了以下 aes 成就的最初目标:

• 可供政府和商业使用的功能强大的加密算法

• 支持标准密码本方式

• 要明显比 DES 3 有效

• 密钥大小可变,这样就可在必要时增加安全性

• 以公正和公开的方式进行选择

• 可以公开定义

• 可以公开评估

aes 的草案中最低可接受要求和评估标准是:

A.1 aes 应该可以公开定义。

A.2 aes 应该是对称的块密码。

A.3 aes 应该设计成密钥长度可以根据需要增加。

A.4 aes 应该可以在硬件和软件中实现。

A.5 aes 应该 a) 可免费获得。

A.6 将根据以下要素评价符合上述要求的算法:

1. 安全性(密码分析所需的努力)

2. 计算效率

3. 内存需求

4. 硬件和软件可适用性

5. 简易性

6. 灵活性

7. 许可证需求(见上面的 A5)

Rijndael:aes 算法获胜者

1998年8月20日NIST召开了第一次aes侯选会议,并公布了15个aes侯选算法。经过一年的考察,MARS,RC6,Rijndael,Serpent,Twofish共5种算法通过了第二轮的选拔。2000 年 10 月,NIST 选择 Rijndael(发音为 "Rhine dale")作为 aes 算法。它目前还不会代替 DES 3 成为政府日常加密的方法,因为它还须通过测试过程,“使用者”将在该测试过程后发表他们的看法。但相信它可以顺利过关。

Rijndael 是带有可变块长和可变密钥长度的迭代块密码。块长和密钥长度可以分别指定成 128、192 或 256 位。

Rijndael 中的某些操作是在字节级上定义的,字节表示有限字段 GF(28) 中的元素,一个字节中有 8 位。其它操作都根据 4 字节字定义。

加法照例对应于字节级的简单逐位 EXOR。

在多项式表示中,GF(28) 的乘法对应于多项式乘法模除阶数为 8 的不可约分二进制多项式。(如果一个多项式除了 1 和它本身之外没有其它约数,则称它为不可约分的。)对于 Rijndael,这个多项式叫做 m(x),其中:m(x) = (x8 + x4 + x3 + x + 1) 或者十六进制表示为 '11B'。其结果是一个阶数低于 8 的二进制多项式。不像加法,它没有字节级的简单操作。

不使用 Feistel 结构!

在大多数加密算法中,轮回变换都使用著名的 Feistel 结构。在这个结构中,中间 State 的位部分通常不做更改调换到另一个位置。(这种线性结构的示例是我们在 DES 部分中讨论的那些表,即使用固定表的形式交换位。)Rijndael 的轮回变换不使用这个古老的 Feistel 结构。轮回变换由三个不同的可逆一致变换组成,叫做层。(“一致”在这里表示以类似方法处理 State 中的位。)

线性混合层保证了在多个轮回后的高度扩散。非线性层使用 S 盒的并行应用,该应用程序有期望的(因此是最佳的)最差非线性特性。S 盒是非线性的。依我看来,这就 DES 和 Rijndael 之间的密钥概念差异。密钥加法层是对中间 State 的轮回密钥 (Round Key) 的简单 EXOR,如以下所注。

Rijndael算法

加密算法

Rijndael算法是一个由可变数据块长和可变密钥长的迭代分组加密算法,数据块长和密钥长可分别为128,192或256比特。

数据块要经过多次数据变换操作,每一次变换操作产生一个中间结果,这个中间结果叫做状态。状态可表示为二维字节数组,它有4行,Nb列,且Nb等于数据块长除32。如表2-3所示。

a0,0 a0,1 a0,2 a0,3 a0,4 a0,5

a1,0 a1,1 a1,2 a1,3 a1,4 a1,5

a2,0 a2,1 a2,2 a2,3 a2,4 a2,5

a3,0 a3,1 a3,2 a3,3 a3,4 a3,5

数据块按a0,0 , a1,0 , a2,0 , a3,0 , a0,1 , a1,1 , a2,1 , a3,1 , a0,2…的顺序映射为状态中的字节。在加密操作结束时,密文按同样的顺序从状态中抽取。

密钥也可类似地表示为二维字节数组,它有4行,Nk列,且Nk等于密钥块长除32。算法变换的圈数Nr由Nb和Nk共同决定,具体值列在表2-4中。

表3-2 Nb和Nk决定的Nr的值

Nr Nb = 4 Nb = 6 Nb = 8

Nk = 4 10 12 14

Nk = 6 12 12 14

Nk = 8 14 14 14

3.2.1圈变换

加密算法的圈变换由4个不同的变换组成,定义成:

Round(State,RoundKey)

{

ByteSub(State);

ShiftRow(State);

MixColumn(State);

AddRoundKey(State,RoundKey); (EXORing a Round Key to the State)

}

加密算法的最后一圈变换与上面的略有不同,定义如下:

FinalRound(State,RoundKey)

{

ByteSub(State);

ShiftRow(State);

AddRoundKey(State,RoundKey);

}

ByteSub变换

ByteSub变换是作用在状态中每个字节上的一种非线形字节变换。这个S盒子是可逆的且由以下两部分组成:

把字节的值用它的乘法逆替代,其中‘00’的逆就是它自己。

经(1)处理后的字节值进行如下定义的仿射变换:

y0 1 1 1 1 1 0 0 0 x0 0

y1 0 1 1 1 1 1 0 0 x1 1

y2 0 0 1 1 1 1 1 0 x2 1

y3 0 0 0 1 1 1 1 1 x3 0

y4 = 1 0 0 0 1 1 1 1 x4 + 0

y5 1 1 0 0 0 1 1 1 x5 0

y6 1 1 1 0 0 0 1 1 x6 1

y7 1 1 1 1 0 0 0 1 x7 1

ShiftRow变换

在ShiftRow变换中,状态的后3行以不同的移位值循环右移,行1移C1字节,行2移C2字节,行3移C3字节。

移位值C1,C2和C3与加密块长Nb有关,具体列在表2-5中:

表3-3 不同块长的移位值

Nb C1 C2 C3

4 1 2 3

MixColumn变换

在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式与一固定多项式c(x)相乘然后模多项式x4+1,其中c(x)为:

c(x) =‘03’x3 + ‘01’x2 + ‘01’x + ‘02’

圈密钥加法

在这个操作中,圈密钥被简单地使用异或操作按位应用到状态中。圈密钥通过密钥编制得到,圈密钥长等于数据块长Nb。

在这个表示法中,“函数”(Round, ByteSub, ShiftRow,...) 对那些被提供指针 (State, RoundKey) 的数组进行操作。ByteSub 变换是非线性字节交换,各自作用于每个 State 字节上。在 ShiftRow 中,State 的行按不同的偏移量循环移位。在 MixColumn 中,将 State 的列视为 GF(28) 多项式,然后乘以固定多项式 c( x ) 并模除 x4 + 1,其中 c( x ) = '03' x3 + '01' x2+ '01' x + '02'。这个多项式与 x4 + 1 互质,因此是可逆的。

轮回密钥通过密钥计划方式从密码密钥 (Cipher Key) 派生而出。它有两个组件:密钥扩展 (Key Expansion) 和轮回密钥选择 (Round Key Selection)。轮回密钥的总位数等于块长度乘以轮回次数加 1(例如,块长度等于 128 位,10 次轮回,那么就需要 1408 个轮回密钥位)。

密码密钥扩充成扩展密钥 (Expanded Key)。轮回密钥是通过以下方法从这个扩展密钥中派生的:第一个轮回密钥由前 Nb(Nb = 块长度)个字组成,第二个由接着的 Nb 个字组成,以此类推。

加密算法由以下部分组成:初始轮回密钥加法、Nr-1 个轮回和最后一个轮回。在伪 C 代码中:

Rijndael(State,CipherKey)

{

KeyExpansion(CipherKey,ExpandedKey);

AddRoundKey(State,ExpandedKey);

For( i=1 ; iNr ; i++ ) Round(State,ExpandedKey + Nb*i);

FinalRound(State,ExpandedKey + Nb*Nr).

}

如果已经预先执行了密钥扩展,则可以根据扩展密钥指定加密算法。

Rijndael(State,ExpandedKey)

{

AddRoundKey(State,ExpandedKey);

For( i=1 ; iNr ; i++ ) Round(State,ExpandedKey + Nb*i);

FinalRound(State,ExpandedKey + Nb*Nr);

}

由于 Rijndael 是可逆的,解密过程只是颠倒上述的步骤。

最后,开发者将仔细考虑如何集成这种安全性进展,使之成为继 Rijndael 之后又一个得到广泛使用的加密算法。aes 将很快应一般商业团体的要求取代 DES 成为标准,而该领域的发展进步无疑将追随其后。

3.IDEA加密算法 (1) 算法简介 IDEA算法是International Data Encryption Algorithmic 的缩写,意为国际数据加密算法。是由中国学者朱学嘉博士和著名密码学家James Massey 于1990年联合提出的,当时被叫作PES(Proposed Encryption Standard)算法,后为了加强抵抗差分密码分,经修改于1992年最后完成,并命名为IDEA算法。 (2) 算法描述 这个部分参见论文上的图 (3) 算法的安全性分析 安全性:IDEA的密钥长度是128位,比DES长了2倍多。所以如果用穷举强行攻击的话, 么,为了获得密钥需要 次搜索,如果可以设计一种每秒能搜索十亿把密钥的芯片,并且 采用十亿个芯片来并行处理的话,也要用上 年。而对于其他攻击方式来说,由于此算法 比较的新,在设计时已经考虑到了如差分攻击等密码分析的威胁,所以还未有关于有谁 发现了能比较成功的攻击IDEA方法的结果。从这点来看,IDEA还是很安全的。

4.总结

几种算法的性能对比

算法 密钥长度 分组长度 循环次数

DES 56 64 16

三重DES 112、168 64 48

aes 128、192、256 128 10、12、14

IDEA 128 64 8

速度:在200MHz的奔腾机上的对比。

C++ DJGP(++pgcc101)

aes 30.2Mbps 68.275Mbps

DES(RSAREF) 10.6Mbps 16.7Mbps

3DES 4.4Mbps 7.3Mbps

Celeron 1GHz的机器上aes的速度,加密内存中的数据

128bits密钥:

C/C++ (Mbps) 汇编(Mbps)

Linux 2.4.7 93 170

Windows2K 107 154

256bits密钥:

C/C++ (Mbps) 汇编(Mbps)

Linux 2.4.7 76 148

Windows2K 92 135

安全性

1990年以来,特制的"DES Cracker"的机器可在几个小时内找出一个DES密钥。换句话说,通过测试所有可能的密钥值,此硬件可以确定用于加密信息的是哪个密钥。假设一台一秒内可找出DES密钥的机器(如,每秒试255个密钥),如果用它来找出128-bit aes的密钥,大约需要149万亿年。

四、对称加密应用 在保密通信中的应用。(保密电话) 附加内容

安全哈希算法(SHA)

由NIST开发出来的。

此算法以最大长度不超过264位的消息为输入,生成160位的消息摘要输出。主要步骤:

1. 附加填充位

2. 附加长度

3. 初始化MD缓冲区,为160位的数据

A=67452301

B=EFCDAB89

C=89BADCFE

D=10325476

E=C3D2E1F0

4. 处理512位消息块,将缓冲虚数据和消息块共同计算出下一个输出

5. 输出160位摘要

此外还有其他哈希算法,如MD5(128位摘要),RIPEMD-160(160位摘要)等。

智能化时代的到来涉及了各种核心算法,保护算法就能保障开发者权益,杜绝市面上各种山寨品,加密芯片恰好能起到很好的保护作用,如何选择加密芯片呢?KEROS加密芯片专注于加密领域十余年,行业首选。
1.安全性:采用国际通用aes256算法加密并同时通过KAS传送,除基本认证之外,利用2K安全EEPROM,用户可以自己管理密钥和数据,实现双重保护。
2.唯一性:以定制的方式为每一位用户单独定制“专属型号CID”,多用户之间算法不兼容,并且采用固化的方法直接将算法固化到晶圆上而无需烧入。
3.序列号:每颗芯片制造生产时具有5字节全球唯一SN序列号,每颗芯片SN都不会重复。
4.防抄特性:每颗芯片都有自己独特的密钥系统,破解单颗芯片只对这颗芯片对应的产品有效,对整个同类型的产品是无效的,依旧无法通过验证。而且KEROS采用ASIC方法设计,芯片内为纯逻辑电路,封装内有40多层逻辑电路整合了10万多个逻辑门,爆力刨片破解难度可想而知。
5.安全存储:用户可以将保密数据加密之后安全的存放到EEPROM中。简易加密算法的介绍就聊到这里吧,感谢你花时间阅读本站内容。

产品列表
产品封装
友情链接