当前位置:首页 » 密码管理 » ios3des加密解密

ios3des加密解密

发布时间: 2022-10-09 05:54:41

‘壹’ 求ios用swift语言写的3des加密解密

可以在swift中调用oc的版的3des,网上有通用的代码

‘贰’ 3des加密原理

使用3Des加密算法前,我们需要了解一下当前主流的加密模式:单向加密和双向加密,两者最大的区别在于加密的密文是否具有可逆性。

单向加密:将需要加密的数据进行加密,并且密文不可进行解密,像我们常用的加密算法MD5就属于这种。

双向加密:和单向加密不同的是可以通过某些方式进行加解密的操作,其中分为对称加密和非对称加密。

对称加密:指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号,本文介绍的3Des加密就属于这种。

非对称加密:通过一组包含公钥和私钥的密码来加密解密,用公钥加密,私钥解密,首推的就是RSA加密

---------------------------------------------------------------------------------------------------------------------------------------

3Des加密算法,由于可以逆推原文,所以主要通过本地的唯一密钥来保证数据的安全性,我这边通过生成随机的256位加密字符串存储在本地,代码读取时将其通过md5加密成32位的字符串(由于本地有原始密钥,不必担心md5加密不可逆),最后以这32位加密字符串作为密钥进行加解密的操作。

‘叁’ IOS开发中3DES的CBC加密模式的demo,求大神帮忙啊

除非特殊需求,现在加密关键数据基本都用AES了,AES相对3DES更安全,更高效。


我给你一个AES256的ios实现(基于NSData的category):

#import"NSData+AESEncryption.h"
#import<CommonCrypto/CommonCryptor.h>

@implementationNSData(AESEncryption)

-(NSData*)AES256EncryptWithKey:(NSString*)key{
//'key'shouldbe32bytesforAES256,willbenull-paddedotherwise
charkeyPtr[kCCKeySizeAES256+1];//roomforterminator(unused)
bzero(keyPtr,sizeof(keyPtr));//fillwithzeroes(forpadding)

//fetchkeydata
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

NSUIntegerdataLength=[selflength];

//Seethedoc:Forblockciphers,
//.
//That'
size_tbufferSize=dataLength+kCCBlockSizeAES128;
void*buffer=malloc(bufferSize);

size_tnumBytesEncrypted=0;
CCCryptorStatuscryptStatus=CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*initializationvector(optional)*/,
[selfbytes],dataLength,/*input*/
buffer,bufferSize,/*output*/
&numBytesEncrypted);
if(cryptStatus==kCCSuccess){
//
return[NSDatadataWithBytesNoCopy:bufferlength:numBytesEncrypted];
}

free(buffer);//freethebuffer;
returnnil;
}

-(NSData*)AES256DecryptWithKey:(NSString*)key{
//'key'shouldbe32bytesforAES256,willbenull-paddedotherwise
charkeyPtr[kCCKeySizeAES256+1];//roomforterminator(unused)
bzero(keyPtr,sizeof(keyPtr));//fillwithzeroes(forpadding)

//fetchkeydata
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

NSUIntegerdataLength=[selflength];

//Seethedoc:Forblockciphers,
//.
//That'
size_tbufferSize=dataLength+kCCBlockSizeAES128;
void*buffer=malloc(bufferSize);

size_tnumBytesDecrypted=0;
CCCryptorStatuscryptStatus=CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*initializationvector(optional)*/,
[selfbytes],dataLength,/*input*/
buffer,bufferSize,/*output*/
&numBytesDecrypted);

if(cryptStatus==kCCSuccess){
//
return[NSDatadataWithBytesNoCopy:bufferlength:numBytesDecrypted];
}

free(buffer);//freethebuffer;
returnnil;
}
@end

‘肆’ 3des的秘钥长度

是3x56bit长的密钥,DES是一个经典的对称加密算法,但也缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES,3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使用 加密->加密->加密 的方式,而是采用了加密->解密->加密 的方式。

‘伍’ 跪求 DES跨(C# Android IOS)三个平台通用的加解密方法


#region跨平台加解密(c#安卓IOS)

//publicstaticstringsKey="12345678";

/////<summary>

/////解密

/////</summary>

/////<paramname="pToDecrypt">要解密的以Base64</param>

/////<paramname="sKey">密钥,且必须为8位</param>

/////<returns>已解密的字符串</returns>

//publicstaticstringDesDecrypt(stringpToDecrypt)

//{

////转义特殊字符

//pToDecrypt=pToDecrypt.Replace("-","+");

//pToDecrypt=pToDecrypt.Replace("_","/");

//pToDecrypt=pToDecrypt.Replace("~","=");

//byte[]inputByteArray=Convert.FromBase64String(pToDecrypt);

//using(DESCryptoServiceProviderdes=newDESCryptoServiceProvider())

//{

//des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);

//des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);

//System.IO.MemoryStreamms=newSystem.IO.MemoryStream();

//using(CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write))

//{

//cs.Write(inputByteArray,0,inputByteArray.Length);

//cs.FlushFinalBlock();

//cs.Close();

//}

//stringstr=Encoding.UTF8.GetString(ms.ToArray());

//ms.Close();

//returnstr;

//}

//}

/////<summary>

/////对字符串进行DES加密

/////</summary>

/////<paramname="sourceString">待加密的字符串</param>

/////<returns>加密后的BASE64编码的字符串</returns>

//publicstringEncrypt(stringsourceString)

//{

//byte[]btKey=Encoding.UTF8.GetBytes(sKey);

//byte[]btIV=Encoding.UTF8.GetBytes(sKey);

//DESCryptoServiceProviderdes=newDESCryptoServiceProvider();

//using(MemoryStreamms=newMemoryStream())

//{

//byte[]inData=Encoding.UTF8.GetBytes(sourceString);

//try

//{

//using(CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(btKey,btIV),CryptoStreamMode.Write))

//{

//cs.Write(inData,0,inData.Length);

//cs.FlushFinalBlock();

//}

//returnConvert.ToBase64String(ms.ToArray());

//}

//catch

//{

//throw;

//}

//}

//}

#endregion

安卓---------------------------------------------------------------------------

////加密

//(Stringmessage,Stringkey)

//throwsException{

//byte[]bytesrc=Base64.decode(message.getBytes(),Base64.DEFAULT);

//Ciphercipher=Cipher.getInstance("DES/CBC/PKCS5Padding");

//DESKeySpecdesKeySpec=newDESKeySpec(key.getBytes("UTF-8"));

//SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");

//SecretKeysecretKey=keyFactory.generateSecret(desKeySpec);

//IvParameterSpeciv=newIvParameterSpec(key.getBytes("UTF-8"));

//cipher.init(Cipher.DECRYPT_MODE,secretKey,iv);

//byte[]retByte=cipher.doFinal(bytesrc);

//returnnewString(retByte);

//}

////解密

//(Stringmessage,Stringkey)

//throwsException{

//Ciphercipher=Cipher.getInstance("DES/CBC/PKCS5Padding");

//DESKeySpecdesKeySpec=newDESKeySpec(key.getBytes("UTF-8"));

//SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");

//SecretKeysecretKey=keyFactory.generateSecret(desKeySpec);

//IvParameterSpeciv=newIvParameterSpec(key.getBytes("UTF-8"));

//cipher.init(Cipher.ENCRYPT_MODE,secretKey,iv);

//byte[]encryptbyte=cipher.doFinal(message.getBytes());

//returnnewString(Base64.encode(encryptbyte,Base64.DEFAULT));

//}

Ios--------------------------------------------------------------------------------------------------------------------

staticconstchar*encryptWithKeyAndType(constchar*text,CCOperationencryptOperation,char*key)
{
NSString*textString=[[NSStringalloc]initWithCString:textencoding:NSUTF8StringEncoding];
//NSLog(@"[[item.urldescription]UTF8String=%@",textString);
constvoid*dataIn;
size_tdataInLength;

if(encryptOperation==kCCDecrypt)//传递过来的是decrypt解码
{
//解码base64
NSData*decryptData=[GTMBase64decodeData:[textStringdataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode
dataInLength=[decryptDatalength];
dataIn=[decryptDatabytes];
}
else//encrypt
{
NSData*encryptData=[textStringdataUsingEncoding:NSUTF8StringEncoding];
dataInLength=[encryptDatalength];
dataIn=(constvoid*)[encryptDatabytes];
}


CCCryptorStatusccStatus;
uint8_t*dataOut=NULL;//可以理解位type/typedef的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)
size_tdataOutAvailable=0;//size_t是操作符sizeof返回的结果类型
size_tdataOutMoved=0;

dataOutAvailable=(dataInLength+kCCBlockSizeDES)&~(kCCBlockSizeDES-1);
dataOut=malloc(dataOutAvailable*sizeof(uint8_t));
memset((void*)dataOut,00,dataOutAvailable);//将已开辟内存空间buffer的首1个字节的值设为值0

//NSString*initIv=@"12345678";
constvoid*vkey=key;
constvoid*iv=(constvoid*)key;//[initIvUTF8String];

//CCCrypt函数加密/解密
ccStatus=CCCrypt(encryptOperation,//加密/解密
kCCAlgorithmDES,//加密根据哪个标准(des,3des,aes。。。。)
kCCOptionPKCS7Padding,//选项分组密码算法(des:对每块分组加一次密3DES:对每块分组加三个不同的密)
vkey,//密钥加密和解密的密钥必须一致
kCCKeySizeDES,//DES密钥的大小(kCCKeySizeDES=8)
iv,//可选的初始矢量
dataIn,//数据的存储单元
dataInLength,//数据的大小
(void*)dataOut,//用于返回数据
dataOutAvailable,
&dataOutMoved);

NSString*result=nil;

if(encryptOperation==kCCDecrypt)//encryptOperation==1解码
{
//得到解密出来的data数据,改变为utf-8的字符串
result=[[NSStringalloc]initWithData:[NSDatadataWithBytes:(constvoid*)dataOutlength:(NSUInteger)dataOutMoved]encoding:NSUTF8StringEncoding];
}
else//encryptOperation==0(加密过程中,把加好密的数据转成base64的)
{
//编码base64
NSData*data=[NSDatadataWithBytes:(constvoid*)dataOutlength:(NSUInteger)dataOutMoved];
result=[GTMBase64stringByEncodingData:data];
}

return[resultUTF8String];

}
+(NSString*)encryptWithContent:(NSString*)contenttype:(CCOperation)typekey:(NSString*)aKey
{
constchar*contentChar=[contentUTF8String];
char*keyChar=(char*)[aKeyUTF8String];
constchar*miChar;
miChar=encryptWithKeyAndType(contentChar,type,keyChar);
return[NSStringstringWithCString:miCharencoding:NSUTF8StringEncoding];
}

‘陆’ 3DES加密解密中的工作密钥(TMK)怎么计算

你好 楼主。
很幸运的看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
对于你的问题我爱莫能助!
可能是你问的问题有些专业了。或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也比较热心,可能能快点帮你解决问题。
希望我的回答也能够帮到你!
祝你好运。
最后祝您全家幸福健康快乐每一天!

‘柒’ 3des加密 密钥

Des的密钥是8个字节,但实际上只有7个用上,也就是56位。
3des是用3个或2个des密钥加密一串明文,最少112位最多168位。也就是14~21个字母或数字符号。
从安全性上来说密钥位数不足是不能加密的,但有些软件为了保证用户可用,会自动使用某种策略自动填充满,一般是重复填充或采用特定字符,如果你只填了1234作为密钥,有可能真正用于加密的密钥是123412341234123412341或者123400000000000000000类似的。
另外请注意,最好去做3des的密钥位数不是7或8,因为des的加密解密是同一个过程,这样搞在填充后实际上是只使用了一次des加密••••••还不如5位6位好••••••
如果是你编程时碰到的问题,把你的源码发来看看再说。

‘捌’ 3DES的算法介绍

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))

‘玖’ 为什么3DES加密算法中间一步是解密,而不是加密|

3DES加密过程中的第二步使用的解密没有密码方面的意义。它的唯一好处是让3DES的使用者能够解密原来单重DES使用者加密的数据

‘拾’ 什么是3DES对称加密算法

DES加密经过下面的步骤
1、提供明文和密钥,将明文按照64bit分块(对应8个字节),不足8个字节的可以进行填充(填充方式多种),密钥必须为8个字节共64bit
填充方式:

当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。
* NoPadding
API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim

* PKCS5Padding
加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8
解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。
例如:加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。
2、选择加密模式

**ECB模式** 全称Electronic Codebook模式,译为电子密码本模式
**CBC模式** 全称Cipher Block Chaining模式,译为密文分组链接模式
**CFB模式** 全称Cipher FeedBack模式,译为密文反馈模式
**OFB模式** 全称Output Feedback模式,译为输出反馈模式。
**CTR模式** 全称Counter模式,译为计数器模式。
3、开始加密明文(内部原理--加密步骤,加密算法实现不做讲解)

image
1、将分块的64bit一组组加密,示列其中一组:将此组进行初始置换(IP置换),目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。
2、开始Feistel结构的16次转换,第一次转换为:右侧数据R0和子密钥经过轮函数f生成用于加密左侧数据的比特序列,与左侧数据L0异或运算,
运算结果输出为加密后的左侧L0,右侧数据则直接输出为右侧R0。由于一次Feistel轮并不会加密右侧,因此需要将上一轮输出后的左右两侧对调后才正式完成一次Feistel加密,
3、DES算法共计进行16次Feistel轮,最后一轮输出后左右两侧无需对调,每次加密的子密钥不相同,子密钥是通过秘钥计算得到的。
4、末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入
DES解密经过下面的步骤
1、拿到密文和加密的密钥
2、解密:DES加密和解密的过程一致,均使用Feistel网络实现,区别仅在于解密时,密文作为输入,并逆序使用子密钥。
3、讲解密后的明文去填充 (padding)得到的即为明文
Golang实现DES加密解密
package main

import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)

func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最后5位是补码
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明码
fmt.Printf("%s",txt) // hello world
}
// 加密函数
func DESEncode(orignData, key []byte)([]byte,error){

// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 明文分组,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())

// 设定加密模式,为了方便,初始向量直接使用key充当了(实际项目中,最好别这么做)
blockMode := cipher.NewCBCEncrypter(block,key)

// 创建密文长度的切片,用来存放密文字节
crypted :=make([]byte,len(txt))

// 开始加密,将txt作为源,crypted作为目的切片输入
blockMode.CryptBlocks(crypted,txt)

// 将加密后的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函数
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 设置解密模式,加密模式和解密模式要一样
blockMode := cipher.NewCBCDecrypter(block,key)

// 设置切片长度,用来存放明文字节
originData := make([]byte,len(cripter))

// 使用解密模式解密,将解密后的明文字节放入originData 切片中
blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)

return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 获取最后一位转为整型,然后根据这个整型截取掉整型数量的长度
// 若此数为5,则减掉转换明文后的最后5位,即为我们输入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在设置加密模式为CBC的时候,我们需要设置一个初始化向量,这个量的意思 在对称加密算法中,如果只有一个密钥来加密数据的话,明文中的相同文字就会也会被加密成相同的密文,这样密文和明文就有完全相同的结构,容易破解,如果给一个初始化向量,第一个明文使用初始化向量混合并加密,第二个明文用第一个明文的加密后的密文与第二个明文混合加密,这样加密出来的密文的结构则完全与明文不同,更加安全可靠。CBC模式图如下

CBC
3DES
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
对比DES,发现只是换了NewTripleDESCipher。不过,需要注意的是,密钥长度必须24byte,否则直接返回错误。关于这一点,PHP中却不是这样的,只要是8byte以上就行;而Java中,要求必须是24byte以上,内部会取前24byte(相当于就是24byte)。另外,初始化向量长度是8byte(目前各个语言都是如此,不是8byte会有问题)

热点内容
mq脚本 发布:2025-05-14 18:45:37 浏览:25
仙境传说ro解压失败 发布:2025-05-14 18:45:01 浏览:866
betweenand的用法sql 发布:2025-05-14 18:39:25 浏览:249
tplink摄像头存储卡格式化 发布:2025-05-14 18:37:08 浏览:345
安卓平板怎么安装excel的软件 发布:2025-05-14 18:35:44 浏览:40
广州数控圆弧编程实例 发布:2025-05-14 18:25:00 浏览:400
搭建服务器能使用nodejs开发吗 发布:2025-05-14 18:24:14 浏览:134
alook浏览器安卓哪个版本上网最快 发布:2025-05-14 18:22:33 浏览:456
sqldist 发布:2025-05-14 18:08:18 浏览:163
人行外管局编译 发布:2025-05-14 18:07:33 浏览:650