求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
加密算法(包含证书)加密解密签名验签
 

作者:zhongxinhua,发布于2012-8-14

 

什么是对称加密和非对称加密?

对称加密是指:有一个密钥,加密用它来加密,解密也需要用到它。因为加密解密都是用同一个密钥所以叫对称加密。

非对称加密是指:就是有 2 个密钥,一个是公钥,一个是私钥。私钥是自己的,不能随便给人,公钥随便给,无所谓。一般是别人用你的公钥加密,然后把密文给你,你用你的私钥解密,这样一样加密和解密不是同一个密钥,所以叫非对称。

对称和非对称的优劣?

对称加密有一个坏处只要拥有密钥的人都可以解密。

非对称的好处是假如没有私钥,别人是无法解密的,就算加密的那个人他把数据加密了他也无法解密,加密者把密文和公钥随便给那个人都无法解密。

什么是数字签名?

数字签名是指:用一段密码与原文进行加密,检测原文有没有被 篡改。意义就是这些数据与原文数据比对是否修改过,这个解释有点麻烦,一般是用自己的私钥对数据进行签名,然后用公钥去验证这个数据是否修改过

1、用 RSACryptoServiceProvider 加密解密

'要加密的数据

Dim messageBytes As Byte() = Text.Encoding.UTF8.GetBytes('激情燃烧的木炭[http://www.woodcoal.cn/]')

'1. 产生公匙和私匙,两个数据都要保存

Dim oRsa As New Security.Cryptography.RSACryptoServiceProvider

Dim privateKey As String = oRsa.ToXmlString(True)

Dim publicKey As String = oRsa.ToXmlString(False)

'2. 用公匙加密数据

Dim oRsaEncode As New Security.Cryptography.RSACryptoServiceProvider

'导入公匙

oRsaEncode.FromXmlString(publicKey)

'输出加密后的数据

Dim resultByte As Byte() = oRsaEncode.Encrypt(messageBytes, False)

'3. 用私匙解密数据

Dim oRsaDecode As New Security.Cryptography.RSACryptoServiceProvider

'导入私匙

oRsaDecode.FromXmlString(privateKey)

'输出解密后的数据

messageBytes = oRsaDecode.Decrypt(resultByte, False)

'结果

Return Text.Encoding.UTF8.GetString(messageBytes)

2、用 RSACryptoServiceProvider 签名验签

'要加密的数据

Dim messageBytes As Byte() = Text.Encoding.UTF8.GetBytes('激情燃烧的木炭[http://www.woodcoal.cn/]')

'1. 产生公匙和私匙,两个数据都要保存

Dim oRsa As New Security.Cryptography.RSACryptoServiceProvider

Dim privateKey As String = oRsa.ToXmlString(True)

Dim publicKey As String = oRsa.ToXmlString(False)

'2. 用私钥匙签名数据

Dim oRsaEncode As New Security.Cryptography.RSACryptoServiceProvider

'导入私钥

oRsaEncode.FromXmlString(privateKey)

'输出签名后的数据

Dim resultByte As Byte() = oRsaEncode.SignData(messageBytes, 'SHA1')

'3. 用公钥验证数据

Dim oRsaDecode As New Security.Cryptography.RSACryptoServiceProvider

'导入公钥

oRsaDecode.FromXmlString(publicKey)

'输出验证后的结果,是否验证成功

Return oRsaDecode.VerifyData(resultByte, 'SHA1', messageBytes)

3、用证书进行签名

因为一般证书的私钥是不可以导出的,所以用第 2 种方法导入私钥的来进行签名行不通。

'要加密的数据

Dim messageBytes As Byte() = Text.Encoding.UTF8.GetBytes('激情燃烧的木炭[http://www.woodcoal.cn/]')

Dim certificatePath As String = 'E:\Certificate.P12'

'导入证书

Dim x509 As New Security.Cryptography.X509Certificates.X509Certificate2(certificatePath, 'Import Password')

Dim privateKey As Security.Cryptography.RSACryptoServiceProvider = x509.PrivateKey

Dim publicKey As String = x509.PublicKey.Key.ToXmlString(False)

'对要签名的数据进行哈希

Dim sha1 As New Security.Cryptography.SHA1CryptoServiceProvider

Dim hashBytes As Byte() = sha1.ComputeHash(messageBytes)

'签名对象

Dim signe As New Security.Cryptography.RSAPKCS1SignatureFormatter

'设置签名用到的私钥

signe.SetKey(privateKey)

'设置签名算法

signe.SetHashAlgorithm('SHA1')

'返回结果

Dim reslutBytes As Byte() = signe.CreateSignature(hashBytes)

'3. 用公钥验证数据,与第2方法相同

Dim oRsaDecode As New Security.Cryptography.RSACryptoServiceProvider

'导入公钥

oRsaDecode.FromXmlString(publicKey)

'输出验证后的结果,是否验证成功

Return oRsaDecode.VerifyData(resultByte, 'SHA1', messageBytes)

4、用证书加密解密

'要加密的数据

Dim messageBytes As Byte() = Text.Encoding.UTF8.GetBytes('激情燃烧的木炭[http://www.woodcoal.cn/]')

Dim certificatePath As String = 'E:\Certificate.P12'

'导入证书

Dim x509 As New Security.Cryptography.X509Certificates.X509Certificate2(certificatePath, 'Import Password')

Dim privateKey As Security.Cryptography.RSACryptoServiceProvider = x509.PrivateKey

Dim publicKey As String = x509.PublicKey.Key.ToXmlString(False)

'证书公钥加密

Dim oRsaEncode As New Security.Cryptography.RSACryptoServiceProvider

oRsaEncode.FromXmlString(publicKey)

Dim resultBytes As Byte() = oRsaEncode.Encrypt(messageBytes, False)

'证书私钥解密

Dim oRsaDecode As Security.Cryptography.RSACryptoServiceProvider = DirectCast(privateKey, Security.Cryptography.RSACryptoServiceProvider)

messageBytes = oRsaDecode.Decrypt(resultBytes, False)

'返回结果

Return Text.Encoding.UTF8.GetString(messageBytes)

5、用证书对文件加密解密

因为文件可能特别大 所以需要用流和 Buffer 的方式,如果把文件全部读到 Byte() 里进行加密,当文件很大,比如 5G,那全部读到 Byte() 里崩溃掉

''' 用证书加密文件

''' 证书路径

''' 证书导入密码

''' 需要加密的文件路径

''' 加密后的文件路径

'''

Public Sub Encrypt(ByVal certificatePath As String, ByVal certificatePassword As String, 
ByVal sourcePath As String, ByVal targetPath As String)  
     '导入证书   
    Dim x509 As New Security.Cryptography.X509Certificates.X509Certificate2(certificatePath,
    certificatePassword)  
     'Dim privateKey As Security.Cryptography.RSACryptoServiceProvider = x509.PrivateKey  
     Dim publicKey As String = x509.PublicKey.Key.ToXmlString(False)   
  
    Dim oRsa As New Security.Cryptography.RSACryptoServiceProvider()   
    oRsa.FromXmlString(publicKey)   
    Dim sourceStream As New System.IO.FileStream(sourcePath, System.IO.FileMode.Open)  
     Dim targetStream As New System.IO.FileStream(targetPath, System.IO.FileMode.OpenOrCreate)  
   
    Dim blockSize As Integer = 0   
    If oRsa.KeySize = 1024 Then  
        blockSize = 16   
    Else  
        blockSize = 8   
    End If  
  
    Dim K As Integer = 1   
    While K > 0   
        Dim buffer As Byte() = New Byte(blockSize - 1) {}   
  
        K = sourceStream.Read(buffer, 0, buffer.Length)   
        If K > 0 Then  
            Dim buffer1 As Byte(), encryblock As Byte()   
            If blockSize = K Then  
                encryblock = oRsa.Encrypt(buffer, False)   
                targetStream.Write(encryblock, 0, encryblock.Length)   
            Else  
                buffer1 = New Byte(K - 1) {}   
                For i As Integer = 0 To K - 1   
                    buffer1(i) = buffer(i)   
                Next  
                encryblock = oRsa.Encrypt(buffer1, False)   
                targetStream.Write(encryblock, 0, encryblock.Length)   
            End If  
        Else  
            sourceStream.Close()   
            targetStream.Close()   
        End If  
    End While  
End Sub   

''' 用证书解密文件

''' 证书路径

''' 证书导入密码

''' 需要解密的文件路径

''' 解密后的文件路径

'''

Public Sub Decrypt(ByVal certificatePath As String, ByVal certificatePassword As String,
 ByVal sourcePath As String, ByVal targetPath As String)  
     '导入证书   
    Dim x509 As New Security.Cryptography.X509Certificates.X509Certificate2(certificatePath, 
	certificatePassword)  
     Dim privateKey As Security.Cryptography.RSACryptoServiceProvider = x509.PrivateKey  
     'Dim publicKey As String = x509.PublicKey.Key.ToXmlString(False)   
  
    Dim oRsa As Security.Cryptography.RSACryptoServiceProvider = DirectCast(privateKey, 
    Security.Cryptography.RSACryptoServiceProvider)  
     Dim sourceStream As New System.IO.FileStream(sourcePath, System.IO.FileMode.Open)  
     Dim targetStream As New System.IO.FileStream(targetPath, System.IO.FileMode.OpenOrCreate)  
   
    Dim blockSize As Integer = oRsa.KeySize / 8   
    Dim buffer1 As Byte(), encryblock As Byte()   
  
    Dim K As Integer = 1   
    While K > 0   
        Dim buffer As Byte() = New Byte(blockSize - 1) {}   
        K = sourceStream.Read(Buffer, 0, Buffer.Length)   
        If K > 0 Then  
            If blockSize = K Then  
                encryblock = oRsa.Decrypt(buffer, False)   
                targetStream.Write(encryblock, 0, encryblock.Length)   
            Else  
                buffer1 = New Byte(K - 1) {}   
                For i As Integer = 0 To K - 1   
                    buffer1(i) = buffer(i)   
                Next  
                encryblock = oRsa.Decrypt(buffer1, False)   
                targetStream.Write(encryblock, 0, encryblock.Length)   
            End If  
        Else  
            sourceStream.Close()   
            targetStream.Close()   
        End If  
    End While  
End Sub   

6、用证书对文件进行签名验签

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)    
    x509 = New X509Certificate2(Path, '12345678')    
    SignFile('1.txt', '11.txt')    
       
    VerifyFile('1.txt', '11.txt')    
End Sub    
Private Function VerifyFile(ByVal FileName As String, ByVal SignedFileName As String) As Boolean   
        
    Dim reslut As Boolean = True    
       
    Dim objread As New System.IO.StreamReader(FileName)    
    Dim objreadSigned As New System.IO.StreamReader(SignedFileName)    
       
    Dim VeryRsa As New RSACryptoServiceProvider()    
    VeryRsa.FromXmlString(x509.PublicKey.Key.ToXmlString(False))    
       
    Dim Inblocksize As Integer = 0    
    Dim Signedblocksize As Integer = 0    
    If VeryRsa.KeySize = 1024 Then    
        Inblocksize = 16    
    Else    
        Inblocksize = 8    
    End If    
    Signedblocksize = VeryRsa.KeySize / 8    
       
    Dim Closed As Boolean = True    
    Dim Buffer As Byte()    
    '原文缓存区    
    Dim InBuffer As Byte()    
    '原文缓存区    
    Dim Buffer1 As Byte()    
    '签名文件缓存区    
    While Closed    
        Buffer = Nothing    
        Buffer = New Byte(Inblocksize - 1) {}    
        Dim k As Integer = objread.BaseStream.Read(Buffer, 0, Buffer.Length)    
        If k > 0 Then    
            If Inblocksize = k Then    
                '读出来的长度和缓存区一样大    
                Buffer1 = New Byte(Signedblocksize - 1) {}    
                objreadSigned.BaseStream.Read(Buffer1, 0, Buffer1.Length)    
                reslut = VeryRsa.VerifyData(Buffer, 'SHA1', Buffer1)    
                If Not reslut Then    
                    Closed = False    
                End If    
            Else    
                '意思是Buffer没满,只有k个字节,k字节后面全是空所以不需要验签    
                InBuffer = New Byte(k - 1) {}    
                For i As Integer = 0 To k - 1    
                    InBuffer(i) = Buffer(i)    
                Next    
                Buffer1 = New Byte(Signedblocksize - 1) {}    
                objreadSigned.BaseStream.Read(Buffer1, 0, Buffer1.Length)    
                reslut = VeryRsa.VerifyData(InBuffer, 'SHA1', Buffer1)    
                If Not reslut Then    
                    Closed = False    
                End If    
            End If    
        Else
            '这里的意思是原文已经读完毕了,并且已经和签名文件对应验签成功,那么    
            '签名文件也必须读完毕了。    
            If objreadSigned.BaseStream.Position <> objreadSigned.BaseStream.Length Then   
                 reslut = False    
            End If    
            objreadSigned.Close()    
            objread.Close()    
            Closed = False    
        End If    
    End While    
    Return reslut    
       
       
End Function    
Private Sub SignFile(ByVal InFileName As String, ByVal OutFileName As String)   
     Dim SignRsa As RSACryptoServiceProvider = DirectCast(x509.PrivateKey, RSACryptoServiceProvider)   
        
    Dim objread As New System.IO.StreamReader(InFileName)    
    Dim objwrite As New System.IO.StreamWriter(OutFileName, False)    
       
    Dim blocksize As Integer = 0    
    If SignRsa.KeySize = 1024 Then    
        blocksize = 16    
    Else    
        blocksize = 8    
    End If    
       
    Dim Closed As Boolean = True    
    Dim Buffer As Byte() = New Byte(blocksize - 1) {}    
    Dim buffer1 As Byte(), SignBytes As Byte()    
    While Closed    
        Dim k As Integer = objread.BaseStream.Read(Buffer, 0, Buffer.Length)    
        If k > 0 Then    
            If k = blocksize Then    
                SignBytes = SignRsa.SignData(Buffer, 'SHA1')    
                objwrite.BaseStream.Write(SignBytes, 0, SignBytes.Length)    
            Else    
                buffer1 = New Byte(k - 1) {}    
                For i As Integer = 0 To k - 1    
                    buffer1(i) = Buffer(i)    
                Next    
                SignBytes = SignRsa.SignData(buffer1, 'SHA1')    
                objwrite.BaseStream.Write(SignBytes, 0, SignBytes.Length)    
            End If    
        Else    
            Closed = False    
            objread.Close()    
            objwrite.Close()    
        End If    
    End While    
       
       
End Sub      

相关文章

企业架构、TOGAF与ArchiMate概览
架构师之路-如何做好业务建模?
大型网站电商网站架构案例和技术架构的示例
完整的Archimate视点指南(包括示例)
相关文档

数据中台技术架构方法论与实践
适用ArchiMate、EA 和 iSpace进行企业架构建模
Zachman企业架构框架简介
企业架构让SOA落地
相关课程

云平台与微服务架构设计
中台战略、中台建设与数字商业
亿级用户高并发、高可用系统架构
高可用分布式架构设计与实践

 
分享到
 
 
     


iOS应用安全开发
Web安全之SQL注入攻击
APP安全在渗透测试中的应用
初探PHP的SQL注入攻击的技术
从Google备份看“数据安全”
更多...   


WEB网站与应用安全原理与实践
web应用安全架构设计
创建安全的J2EE Web应用代码
注册信息安全专业人员(CISP)
信息安全管理
信息安全问题与防范


中国银行 信息安全技术及深度防御
Web应用安全架构、入侵检测与防护
某财税领域知名IT服务商 Web安全测试
普瑞克斯 web安全设计、测试与优化
北京和利时 性能和安全性测试
SUN中国工程研究院 JSF框架、安全
更多...