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

iosdes对称加密(ios对称加密和非对称加密)

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

本篇文章给大家谈谈iosdes对称加密,以及ios对称加密和非对称加密对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

DES加密和解密的对称性

#include iostream

#include fstream

using namespace std;

const static char ip[] = { //IP置换

58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6,

64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1,

59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5,

63, 55, 47, 39, 31, 23, 15, 7

};

const static char fp[] = { //zuizhongzhihuan

40, 8, 48, 16, 56, 24, 64, 32,

39, 7, 47, 15, 55, 23, 63, 31,

38, 6, 46, 14, 54, 22, 62, 30,

37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28,

35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26,

33, 1, 41, 9, 49, 17, 57, 25

};

const static char sbox[8][64] = { //s_box

/* S1 */

14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,

0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,

4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,

15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,

/* S2 */

15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,

3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,

0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,

13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,

/* S3 */

10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,

13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,

13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,

1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,

/* S4 */

7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,

13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,

10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,

3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,

/* S5 */

2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,

14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,

4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,

11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,

/* S6 */

12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,

10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,

9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,

4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,

/* S7 */

4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,

13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,

1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,

6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,

/* S8 */

13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,

1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,

7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,

2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11

};

const static char rar[] = { //ya suo zhi huan

14, 17, 11, 24, 1, 5,

3, 28, 15, 6, 21, 10,

23, 19, 12, 4, 26, 8,

16, 7, 27, 20, 13, 2,

41, 52, 31, 37, 47, 55,

30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53,

46, 42, 50, 36, 29, 32

};

const static char ei[] = { //kuo zhan zhi huan

32, 1, 2, 3, 4, 5,

4, 5, 6, 7, 8, 9,

8, 9, 10, 11, 12, 13,

12, 13, 14, 15, 16, 17,

16, 17, 18, 19, 20, 21,

20, 21, 22, 23, 24, 25,

24, 25, 26, 27, 28, 29,

28, 29, 30, 31, 32, 1

};

const static char Pzh[]={ //P置换

16, 7, 20, 21,

29, 12, 28, 17,

1, 15, 23, 26,

5, 18, 31, 10,

2, 8, 24, 14,

32, 27, 3, 9,

19, 13, 30, 6,

22, 11, 4, 25

};

const static char Keyrar[]={

57, 49, 41, 33, 25, 17, 9,

1, 58, 50, 42, 34, 26, 18,

10, 2, 59, 51, 43, 35, 27,

19, 11, 3, 60, 52, 44, 36,

63, 55, 47, 39, 31, 23, 15,

7, 62, 54, 46, 38, 30, 22,

14, 6, 61, 53, 45, 37, 29,

21, 13, 5, 28, 20, 12, 4

};

bool key[16][48]={0},/*rekey[16][48],*/

char key_in[8];

void ByteToBit(bool *Out,char *In,int bits) //字节到位的转换

{

int i;

for(i=0;ibits;i++)

Out[i]=(In[i/8](i%8))1;

}

void BitToByte(char *Out,bool *In,int bits) //位到字节转换

{

for(int i=0;ibits/8;i++)

Out[i]=0;

for(i=0;ibits;i++)

Out[i/8]|=In[i](i%8); //"|="组合了位操作符和赋值操作符的功能

}

void Xor(bool *InA,const bool *InB,int len) //按位异或

{

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

InA[i]^=InB[i];

}

void keyfc(char *In) //获取密钥函数

{

int i,j=0,mov,k;

bool key0[56],temp,keyin[64];

ByteToBit(keyin,In,64); //字节到位的转换

for(i=0;i56;i++) //密钥压缩为56位

key0[i]=keyin[Keyrar[i]-1];

for(i=0;i16;i++) //16轮密钥产生

{

if(i==0||i==1||i==8||i==15)

mov=1;

else

mov=2;

for(k=0;kmov;k++) //分左右两块循环左移

{

// for(int m=0;m8;m++)

// {

// temp=key0[m*7];

// for(j=m*7;jm*7+7;j++)

// key0[j]=key0[j+1];

// key0[m*7+6]=temp;

// }

temp=key0[0];

for(int m=0;m27;m++)

key0[m]=key0[m+1];

key0[27]=temp;

temp=key0[28];

for(m=28;m55;m++)

key0[m]=key0[m+1];

key0[55]=temp;

}

for(j=0;j48;j++) //压缩置换并储存

key[i][j]=key0[rar[j]-1];

}

}

void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0时加密,反之解密

{

bool MW[64],tmp[32],PMW[64]; //注意指针

bool kzmw[48],keytem[48],ss[32];

int hang,lie;

ByteToBit(PMW,In,64);

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

{

MW[j]=PMW[ip[j]-1]; //初始置换

}

bool *Li=MW[0],*Ri=MW[32];

for(int i=0;i48;i++) //右明文扩展置换

kzmw[i]=Ri[ei[i]-1]; //注意指针

if(MS==0) //DES加密过程

{

for(int lun=0;lun16;lun++)

{

for(i=0;i32;i++)

ss[i]=Ri[i];

for(i=0;i48;i++) //右明文扩展置换

kzmw[i]=Ri[ei[i]-1]; //注意指针

for(i=0;i48;i++)

keytem[i]=key[lun][i]; //轮密钥

Xor(kzmw,keytem,48);

/*S盒置换*/

for(i=0;i8;i++)

{

hang=kzmw[i*6]*2+kzmw[i*6+5];

lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];

tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;

tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;

tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;

tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;

}

for(int i=0;i32;i++) //P置换

Ri[i]=tmp[Pzh[i]-1];

Xor(Ri,Li,32); //异或

for(i=0;i32;i++) //交换左右明文

{

Li[i]=ss[i];

}

}

for(i=0;i32;i++)

{

tmp[i]=Li[i];

Li[i]=Ri[i];

Ri[i]=tmp[i];

}

for(i=0;i64;i++)

PMW[i]=MW[fp[i]-1];

BitToByte(Out,PMW,64); //位到字节的转换

}

else //DES解密过程

{

for(int lun=15;lun=0;lun--)

{

for(i=0;i32;i++)

ss[i]=Ri[i];

for(int i=0;i48;i++) //右明文扩展置换

kzmw[i]=Ri[ei[i]-1]; //注意指针

for(i=0;i48;i++)

keytem[i]=key[lun][i]; //轮密钥

Xor(kzmw,keytem,48);

/*S盒置换*/

for(i=0;i8;i++)

{

hang=kzmw[i*6]*2+kzmw[i*6+5];

lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];

tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;

tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;

tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;

tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;

}

for(i=0;i32;i++) //P置换

Ri[i]=tmp[Pzh[i]-1];

Xor(Ri,Li,32); //异或

for(i=0;i32;i++) //交换左右明文

{

Li[i]=ss[i];

}

}

for(i=0;i32;i++)

{

tmp[i]=Li[i];

Li[i]=Ri[i];

Ri[i]=tmp[i];

}

for(i=0;i64;i++)

PMW[i]=MW[fp[i]-1];

BitToByte(Out,PMW,64); //位到字节的转换

}

}

void main()

{

char Ki[8],jm[8],final[8];

int i0;

cout"请输入密钥(8字节):"endl;

for(i0=0;i08;i0++)

cinKi[i0];

// if(i08)

// for(i0=0;i08;i0++)

// cin//[i0];

keyfc(Ki);

cout"请输入明文:"endl;

for(i0=0;i08;i0++)

cinjm[i0];

DES(final,jm,0); //加密

for(i0=0;i08;i0++)

coutfinal[i0];

coutendl;

DES(jm,final,1); //解密

for(i0=0;i08;i0++)

coutjm[i0];

coutendl;

}

这个事用VC实现

给你算法你自己看

对称加密算法中,des算法的密钥长度是多少,采用什么进行加密

DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。与每轮编码时,一个48位的“每轮”密钥值由56位的完整密钥得出来。DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,但幸运的是当时大多数黑客并没有足够的设备制造出这种硬件设备。在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。所以,当时DES被认为是一种十分强壮的加密方法。

 但是,当今的计算机速度越来越快了,制造一台这样特殊的机器的花费已经降到了十万美元左右,所以用它来保护十亿美元的银行间线缆时,就会仔细考虑了。另一个方面,如果只用它来保护一台服务器,那么DES确实是一种好的办法,因为黑客绝不会仅仅为入侵一个服务器而花那么多的钱破解DES密文。由于现在已经能用二十万美圆制造一台破译DES的特殊的计算机,所以现在再对要求“强壮”加密的场合已经不再适用了。

 三重DES

 因为确定一种新的加密法是否真的安全是极为困难的,而且DES的唯一密码学缺点,就是密钥长度相对比较短,所以人们并没有放弃使用DES,而是想出了一个解决其长度问题的方法,即采用三重DES。这种方法用两个密钥对明文进行三次加密,假设两个密钥是K1和K2,其算法的步骤如图5.9所示:

 1. 用密钥K1进行DEA加密。

 2. 用K2对步骤1的结果进行DES解密。

 3. 用步骤2的结果使用密钥K1进行DES加密。

这种方法的缺点,是要花费原来三倍时间,从另一方面来看,三重DES的112位密钥长度是很“强壮”的加密方式了

什么是DES加密

一种对称加密算法,DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

ios怎么对网页请求下来的des加密的data进行解密

之前在项目上用到AES256加密解密算法,刚开始在java端加密解密都没有问题,在iOS端加密解密也没有问题。但是奇怪的是在java端加密后的文件在iOS端无法正确解密打开,然后简单测试了一下,发现在java端和iOS端采用相同明文,相同密钥加密后的密文不一样!上网查了资料后发现iOS中AES加密算法采用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。我们知道加密算法由算法+模式+填充组成,所以这两者不同的填充算法导致相同明文相同密钥加密后出现密文不一致的情况。那么我们需要在java中用PKCS7Padding来填充,这样就可以和iOS端填充算法一致了。

要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现,下面我会提供该包的下载。啰嗦了一大堆,下面是一个简单的测试,上代码!

001 package com.encrypt.file;

002

003

004 import java.io.UnsupportedEncodingException;

005 importjava.security.Key;

006 import java.security.Security;

007

008 importjavax.crypto.Cipher;

009 importjavax.crypto.SecretKey;

010 importjavax.crypto.spec.SecretKeySpec;

011

012 public classAES256Encryption{

013

014 /**

015 * 密钥算法

016 * java6支持56位密钥,bouncycastle支持64位

017 * */

018 public static finalString KEY_ALGORITHM="AES";

019

020 /**

021 * 加密/解密算法/工作模式/填充方式

022 *

023 * JAVA6 支持PKCS5PADDING填充方式

024 * Bouncy castle支持PKCS7Padding填充方式

025 * */

026 public static finalString CIPHER_ALGORITHM="AES/ECB/PKCS7Padding";

027

028 /**

029 *

030 * 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥

031 * @return byte[] 二进制密钥

032 * */

033 public static byte[] initkey() throwsException{

034

035 // //实例化密钥生成器

036 // Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

037 // KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM, "BC");

038 // //初始化密钥生成器,AES要求密钥长度为128位、192位、256位

039 //// kg.init(256);

040 // kg.init(128);

041 // //生成密钥

042 // SecretKey secretKey=kg.generateKey();

043 // //获取二进制密钥编码形式

044 // return secretKey.getEncoded();

045 //为了便于测试,这里我把key写死了,如果大家需要自动生成,可用上面注释掉的代码

046 return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c,

047 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07, 0x0a, 0x04, 0x0f,

048 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09,

049 0x06, 0x07, 0x09, 0x0d };

050 }

051

052 /**

053 * 转换密钥

054 * @param key 二进制密钥

055 * @return Key 密钥

056 * */

057 public static Key toKey(byte[] key) throwsException{

058 //实例化DES密钥

059 //生成密钥

060 SecretKey secretKey=newSecretKeySpec(key,KEY_ALGORITHM);

061 returnsecretKey;

062 }

063

064 /**

065 * 加密数据

066 * @param data 待加密数据

067 * @param key 密钥

068 * @return byte[] 加密后的数据

069 * */

070 public static byte[] encrypt(byte[] data,byte[] key) throwsException{

071 //还原密钥

072 Key k=toKey(key);

073 /**

074 * 实例化

075 * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现

076 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")

077 */

078 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

079 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM, "BC");

080 //初始化,设置为加密模式

081 cipher.init(Cipher.ENCRYPT_MODE, k);

082 //执行操作

083 returncipher.doFinal(data);

084 }

085 /**

086 * 解密数据

087 * @param data 待解密数据

088 * @param key 密钥

089 * @return byte[] 解密后的数据

090 * */

091 public static byte[] decrypt(byte[] data,byte[] key) throwsException{

092 //欢迎密钥

093 Key k =toKey(key);

094 /**

095 * 实例化

096 * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现

097 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")

098 */

099 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);

100 //初始化,设置为解密模式

101 cipher.init(Cipher.DECRYPT_MODE, k);

102 //执行操作

103 returncipher.doFinal(data);

104 }

105 /**

106 * @param args

107 * @throws UnsupportedEncodingException

108 * @throws Exception

109 */

110 public static void main(String[] args) throwsUnsupportedEncodingException{

111

112 String str="AES";

113 System.out.println("原文:"+str);

114

115 //初始化密钥

116 byte[] key;

117 try {

118 key = AES256Encryption.initkey();

119 System.out.print("密钥:");

120 for(int i = 0;ikey.length;i++){

121 System.out.printf("%x", key[i]);

122 }

123 System.out.print("\n");

124 //加密数据

125 byte[] data=AES256Encryption.encrypt(str.getBytes(), key);

126 System.out.print("加密后:");

127 for(int i = 0;idata.length;i++){

128 System.out.printf("%x", data[i]);

129 }

130 System.out.print("\n");

131

132 //解密数据

133 data=AES256Encryption.decrypt(data, key);

134 System.out.println("解密后:"+newString(data));

135 } catch (Exception e) {

136 // TODO Auto-generated catch block

137 e.printStackTrace();

138 }

139

140 }

141 }

运行程序后的结果截图:

ViewController.m文件

01 //

02 // ViewController.m

03 // AES256EncryptionDemo

04 //

05 // Created by 孙 裔 on 12-12-13.

06 // Copyright (c) 2012年 rich sun. All rights reserved.

07 //

08

09 #import "ViewController.h"

10 #import "EncryptAndDecrypt.h"

11

12 @interface ViewController ()

13

14 @end

15

16 @implementation ViewController

17 @synthesize plainTextField;

18 - (void)viewDidLoad

19 {

20 [super viewDidLoad];

21 // Do any additional setup after loading the view, typically from a nib.

22 }

23

24 - (void)didReceiveMemoryWarning

25 {

26 [super didReceiveMemoryWarning];

27 // Dispose of any resources that can be recreated.

28 }

29 //这个函数实现了用户输入完后点击视图背景,关闭键盘

30 - (IBAction)backgroundTap:(id)sender{

31 [plainTextField resignFirstResponder];

32 }

33

34 - (IBAction)encrypt:(id)sender {

35

36 NSString *plainText = plainTextField.text;//明文

37 NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

38

39 //为了测试,这里先把密钥写死

40 Byte keyByte[] = {0x08,0x08,0x04,0x0b,0x02,0x0f,0x0b,0x0c,0x01,0x03,0x09,0x07,0x0c,0x03,

41 0x07,0x0a,0x04,0x0f,0x06,0x0f,0x0e,0x09,0x05,0x01,0x0a,0x0a,0x01,0x09,

42 0x06,0x07,0x09,0x0d};

43 //byte转换为NSData类型,以便下边加密方法的调用

44 NSData *keyData = [[NSData alloc] initWithBytes:keyByte length:32];

45 //

46 NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyData];

47 Byte *plainTextByte = (Byte *)[cipherTextData bytes];

48 for(int i=0;i[cipherTextData length];i++){

49 printf("%x",plainTextByte[i]);

50 }

51

52 }

53 @end

附上出处链接:

关于iosdes对称加密和ios对称加密和非对称加密的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文标签:iosdes对称加密

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