1,对称加密算法
密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。
特点:算法公开、计算量小、加密速度快、加密效率高特点。但交易双方都使用同样钥匙,安全性得不到保证。
具体算法有:DES算法,3DES算法,AES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。
2,非对称加密算法
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
特点:由于有两种密钥,其中一个是公开的,这样就消除了最终用户交换密钥的需要,更安全。但由于算法复杂,加密解密速度没有对称加密解密的速度快。
主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
3,RSA算法
(1)RSA算法是第一个能同时用于加密和数字签名的算法。
(2)RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
(3)RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
(4)由于RSA的安全性依赖于大数分解,为保证安全,目前来说RSA密钥(即n)长度至少要为1024位。
(5)由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍。
4,RSA加密内容长度限制的问题
通常1024位key的最多只能加密127位数据,要解决这个问题有两种办法:
(1)自己把数据变成N个117字节的数据段来分别加密,解密也需要自己一个个解密再完成字节拼装
(2)加密的时候:使用对称加密(AES/DES etc)加密数据,然后用RSA公钥加密对称加密的密钥。
解密的时候:用RSA的私钥解密得到对称加密的密钥,然后完成反向操作得到明文。 (推荐这种方式)
5,RSA的使用场合
1,用于加密数据:比如我是公司领导,我希望员工A,B,C给我发消息的时候能够加密。那么我这边可以生成一对密钥,把公钥给ABC。A把消息使用公钥加密后发给我,我收到后使用私钥即可解密。这过程中如果加密消息被BC拦截了,虽然他们有一样的公钥,但是无法解密的。
2,用于数字签名:比如我要给A,B,C发送一段数据,但为了保证这个是我发送的,而不是别人伪造的,那么我可以附上我的数字签名。做法是对数据进行MD5之类的运算以取得数据的”指纹”,再对”指纹”进行加密,加密将使用密钥对中的不公开的私钥。A,B,C收到数据后,用同样的运算获得数据指纹,再用公钥对加密指纹进行解密,比较解密结果与他自己计算出来的指纹是否一致,即可确定数据是否的确是我发送的、以及在传输过程中是否被篡改。
SHA256
#import <CommonCrypto/CommonDigest.h>
- (NSString *)SHA256
{
const char *s = [self cStringUsingEncoding:NSASCIIStringEncoding];
NSData *keyData = [NSData dataWithBytes:s length:strlen(s)];
uint8_t digest[CC_SHA256_DIGEST_LENGTH] = {0};
CC_SHA256(keyData.bytes, (CC_LONG)keyData.length, digest);
NSData *out = [NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
return hash;
}
func sha256() -> String{
if let stringData = self.data(using: .utf8) {
return hexStringFromData(input: digest(input: stringData as NSData))
}
return ""
}
private func digest(input : NSData) -> NSData {
let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
var hash = [UInt8](repeating: 0, count: digestLength)
CC_SHA256(input.bytes, UInt32(input.length), &hash)
return NSData(bytes: hash, length: digestLength)
}
private func hexStringFromData(input: NSData) -> String {
var bytes = [UInt8](repeating: 0, count: input.length)
input.getBytes(&bytes, length: input.length)
var hexString = ""
for byte in bytes {
hexString += String(format:"%02x", UInt8(byte))
}
return hexString
}