RSA DES SHA1加密总结

RSA加密算法学习

RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:

1,算法描述

(1)选择一对不同的、足够大的素数p,q。

(2)计算n=pq。

(3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。

(4)找一个与f(n)互质的数e,且1

(5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)

这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。

(6)公钥KU=(e,n),私钥KR=(d,n)。

(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:。

(8)解密过程为:。

 

X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellmanalgorithms。

2,加密操作

//从只包含公钥的证书文件载入证书

X509Certificate2 myX509Certificate2 = newX509Certificate2(@"C:\Samples\PartnerAEncryptMsg\MyTestCert.cer");

//从cer证书中获得含公钥的RSACryptoServiceProvider

RSACryptoServiceProvidermyRSACryptoServiceProvider =(RSACryptoServiceProvider)myX509Certificate2.PublicKey.Key;

//使用RSACryptoServiceProvider把明文字节流加密为密文字节流

Byte[] Cryptograph =myRSACryptoServiceProvider.Encrypt(plainTextByte, false);

 

使用1024为的密钥加密,原料应该是128字节(1024位)的byte[]的原始数据,加密后的数据也是128字节(1024位),如果明文不足128字节,RSACryptoServiceProvider会自动用随机数补足128字节。

Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数。

所以,用同一个密钥对同一串字符串进行加密,每次得到的密文都是不一样的。

 

3, 解密操作

//从证书文件载入证书,如果含有私钥的,需要提供保存证书时设置的密码

X509Certificate2myX509Certificate2 = newX509Certificate2(@"C:\Samples\PartnerAEncryptMsg\MyTestCert.pfx","password");

//从证书中获得含私钥的RSACryptoServiceProvider

RSACryptoServiceProvidermyRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PrivateKey;

//使用RSACryptoServiceProvider把密文字节流解密为明文字节流

byte[]plaintextByte = myRSACryptoServiceProvider.Decrypt(Cryptograph, false);

解密需要载入含私钥的pfx证书,需要提供私钥保护密码。

 

DES加密算法学习

1,加密原理

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

 

2,DES算法的安全性

一.安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法.

二.采用64位密钥技术,实际只有56位有效,8位用来校验的.譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年.所以这种算法还是比较安全的一种算法.

 

3,加密流程

4,加密

注意:DES加密和解密过程中,密钥长度都必须是8的倍数

public byte[] desCrypto(byte[] datasource, String password) {

try{

SecureRandom random = new SecureRandom();

DESKeySpec desKey = new DESKeySpec(password.getBytes());

//创建一个密匙工厂,然后用它把DESKeySpec转换成

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey securekey = keyFactory.generateSecret(desKey);

       //Cipher对象实际完成加密操作

      Cipher cipher = Cipher.getInstance("DES");

       //用密匙初始化Cipher对象

       cipher.init(Cipher.ENCRYPT_MODE, securekey, random);

       //现在,获取数据并加密

       //正式执行加密操作

       return cipher.doFinal(datasource);

   }catch(Throwable e){

        e.printStackTrace();

    }

   return null;

}

 

5,解密

private byte[] decrypt(byte[] src, String password) throws Exception {  

        // DES算法要求有一个可信任的随机数源  

        SecureRandom random = new SecureRandom();  

        // 创建一个DESKeySpec对象  

        DESKeySpec desKey = new DESKeySpec(password.getBytes());  

        // 创建一个密匙工厂  

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  

        // 将DESKeySpec对象转换成SecretKey对象  

        SecretKey securekey = keyFactory.generateSecret(desKey);  

        // Cipher对象实际完成解密操作  

        Cipher cipher = Cipher.getInstance("DES");  

        // 用密匙初始化Cipher对象  

        cipher.init(Cipher.DECRYPT_MODE, securekey, random);  

        // 真正开始解密操作  

        return cipher.doFinal(src);  

}  

 

6,混合加密的理由

  a、前面提及了RSA加解密算法和DES加解密算法这 两种加解密算法,由于随着计算机系统能力的不断发展,DES的安全性比它刚出现时会弱得多,追溯历史破解DES的案例层出不穷,一台实际的机器可以在数天内破解DES是让某些人相信他们不能依赖DES的安全性的唯一方法。而相对于DES,RSA的安全性则相对高些,虽然破解RSA的案例也有,但其所付出的代价是相对大的(相对DES),如今RSA的密钥也在升级,这说明破解RSA的难度也在增大。

  b、在RSA加解密算法中提及到RSA加密明文会受密钥的长度限制,这就说明用RSA加密的话明文长度是有限制的,而在实际情况我们要进行加密的明文长度或许会大于密钥长度,这样一来我们就不得不舍去RSA加密了。对此,DES加密则没有此限制。

  鉴于以上两点(个人观点),单独的使用DES或RSA加密可能没有办法满足实际需求,所以就采用了RSA和DES加密方法相结合的方式来实现数据的加密。

  其实现方式即:

  1、信息(明文)采用DES密钥加密。

  2、使用RSA加密前面的DES密钥信息。

  最终将混合信息进行传递。

  而接收方接收到信息后:

  1、用RSA解密DES密钥信息。

  2、再用RSA解密获取到的密钥信息解密密文信息。

  最终就可以得到我们要的信息(明文)。

7,实现例子:

结合前面RSA和DES加密:

///

/// RSADES混合加密

///

/// 待加密数据

/// RSA公钥

///

public Param Encrypt(string data, string publicKey)

{

    //加密数据

   DESSecurity DES = new DESSecurity();

    string DESKey = DES.GenerateKey();

    string encryptData = DES.Encrypt(data, DESKey);

 

    //加密DESkey

   RSASecurity RSA = new RSASecurity();

    string encryptDESKey = RSA.Encrypt(DESKey,publicKey);

 

    Param mixParam = new Param();

    mixParam.DESKey = encryptDESKey;

    mixParam.Data = encryptData;

    return mixParam;

}

 

///

/// RSADES混合解密

///

/// 待解密数据

/// 带解密的DESKey

/// RSA私钥

///

public string Decrypt(string data, stringkey, stringprivateKey)

{

    //解密DESKey

   RSASecurity RSA = new RSASecurity();

    string DESKey = RSA.Decrypt(key, privateKey);

    //解密数据

   DESSecurity DES = new DESSecurity();

    return DES.Decrypt(data, DESKey);

}

 

 

SHA1

安全哈希算法(Secure HashAlgorithm)主要适用于数字签名标准 (Digital SignatureStandard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。

 

该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

 

单向散列函数的 安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。

该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。

通过散列算法可实现数字签名实 现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

MAC (信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。

 

 

总结:

1,  SHA1和MD5是摘要算法,不可逆的。

2,  RSA,客户端公钥加密,公钥解密,服务端四月加密,私钥解密。

3,混合加密时,先DES加密,然后RSA加密,混合解密时,先RSA解密,然后DES解密。

4,  SecretKeySpec(key, algorithm)方法:根据给定的字节数组构造一个密钥

5,   

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(互联网)