Visual FoxPro数据库加密算法的研究与实现

摘  要:对于最初给定的随机种子,随机函数都会生成一个相同的数列。数据库数据随机加密,是一种利用随机函数的随机数序列与数据库数据进行异或等运算、实现数据库数据加密的方法。本文对数据库数据随机加密算法进行了研究和探讨,给出了在Visual FoxPro中实现数据库数据随机加密、解密的程序代码。
关键词:Visual FoxPro;数据库;随机加密;随机函数
 
Visual FoxPro是目前应用最广的数据库之一。对Visual FoxPro数据库中的敏感数据进行加密处理,实现数据存储的安全保护,是大多数用户所希望的。

1 加密算法概述

数据加密的技术可分为两类,即对称加密(私人密钥加密)和非对称加密(公开密钥加密)。对称加密以DES(Data Encryption Standard)算法为典型代表,非对称加密通常以RSA(Rivest Shamir Adleman)算法为代表。对称加密的加密密钥和解密密钥相同,非对称加密的加密密钥和解密密钥不同,加密密钥可以公开而解密密钥需要保密。
1.1 对称加密
对称加密算法中,主要有:序列密码加密法和分组密码加密法。
1.1.1 序列密码加密法
这种加密法将明文与一串同等长度的数据进行运算(例如,异或运算)。如果所用的数据是随机数且不重复使用,就可以实现了“一次一密”的加密。这类密码的明文和密文长度一般不变,传递迅速、快捷。
1.1.2 分组密码加密法
——这种加密法将明文按固定长度分组,对各组数据用不同的密钥加密(或脱解密)。这类密码按分组进行加密变换,一个字符数据不仅与密钥有关,而且还与其他字符数据有关,密码分析的穷尽量很大。
——在使用分组密码时,对明文尾部不满一个整组的碎片通常采用填充随机数的办法将其扩充为一个整组,然后进行正常加密。由于尾组的扩充,使得密文的长度大于明文的长度。
1.2 非对称加密(公开密钥加密)
非对称加密(公开密钥加密)需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。公开密钥加密法的缺点是加/脱解密速度较慢,适用于对少量数据进行加密,常用于用户认证、数字签名以及密钥传输等。
在以上加密算法中,序列加密算法多用于数据库数据加密。本文所讨论的随机加密算法就是序列加密算法的一种具体应用。

2 随机加密算法

在Visual FoxPro等软件中,都提供了一个随机函数。对于最初给定的随机种子,随机函数都会生成一个相同的数列。每一次调用随机函数都用数列中的前一个数作为下一个数的随机种子。我们在数据库加密研究中,利用随机函数的随机数序列对数据库数据进行了加密。
数据库数据随机加密,是一种利用随机函数的随机数序列与数据库数据进行异或等运算、实现数据库数据加密的方法。
加密的算法为:
解密的算法为:
随机加密的优点是:1)随机加密实现了“一次一密”的加密,安全性很高;2)数据库数据随机加密以后,除了增加密钥外,数据量没有明显增加;3)算法简单,容易实现。

3 Visual FoxPro数据库随机加密算法的实现

在Visual FoxPro中,由SECONDS( )函数返回一个从午夜到到当前的秒值(精确到微秒),根据SECONDS( )函数值,随机函数生成一个随机种子。根据随机种子,随机函数生成一个随机数序列,使用此随机数序列与一个字符串进行异或运算,生成一个随机密钥,其长度由字符串长度决定。根据随机密钥,随机函数生成一个新的随机种子。根据此随机种子,随机函数生成一个用于加密的婊蛄校褂么怂婊蛄卸允菘馐萁幸旎蛟怂悖迪侄允菘馐莸募用堋?lt;/DIV>
3.1 Visual FoxPro数据库随机加密
在Visual FoxPro中,可调用下面的Encrypt()函数对数据库记录内容进行随机加密,其参数为要加密的数据。
Function Encrypt
    Parameter s1  &&参数s1为要加密的数据
    s = Str(Seconds(), 9, 3)  && SECONDS( )返回从午夜到到当前的秒值(精确到微秒)
    = RandomSeed(s)  && 根据SECONDS( )值生成随机种子
    s = RandomEncrypt("随机加密")
    &&生成一个随机密钥,长度由调用RandomEncrypt函数的字符串长度确定。
    &&这里的随机密钥长度为字符串"随机加密"的ASSCII个数8。
    = RandomSeed(s)  && 根据随机密钥为要加密的数据生成随机种子
    s = s + RandomEncrypt(s1)  &&对数据进行加密
    Encrypt = ""
    n = 1
    Do While n <= Len(s)
        x = Asc(Substr(s, n, 1))
        Encrypt = Encrypt + HexChar(x)    &&将加密的数据转换为十六进制字符
        n = n + 1
    Enddo
Return Encrypt    &&返回加密的字符
Function RandomSeed  &&生成随机种子过程
    Parameter s
    =Rand(100001)
    n = 1
    Do While n <= Len(s)
        x = Asc(Substr(s, n, 1))
        = Rand(Int(Rand() * x) + 1)   &&改变随机种子
        n = n + 1
    Enddo
Return
Function RandomEncrypt  &&对数据进行随机加密函数
    Parameter s
    RandomEncrypt = ""
    n = 1
    Do While n <= Len(s)
        x = Asc(Substr(s, n, 1))
        x = Bitxor(Int(Rand() * 255), x)
        &&根据Rand()函数值生成一个0到255之间的一个随机数,并与加密字符的
        &&ASCII码进行异或运算。
        RandomEncrypt = RandomEncrypt + Chr(x)
        n = n + 1
    Enddo
Return RandomEncrypt
Function HexChar  &&十进制转换为十六进制
    Parameter x
         x1 = Int(x/16)
         x2 = Mod(x,16)
         Do Case
        Case Between(x1, 0, 9)
            x1Asc = 48 + x1
        Case Between(x1, 10, 15)
            x1Asc = 65 + x1 - 10
    EndCase
    Do Case
        Case Between(x2, 0, 9)
            x2Asc = 48 + x2
        Case Between(x2, 10, 15)
            x2Asc = 65 + x2 - 10
    EndCase
    HexChar = Chr(x1Asc) + Chr(x2Asc)
Return HexChar
3.2 Visual FoxPro数据库解密
在Visual FoxPro中,可调用下面的Decrypt()函数实现对随机加密的数据进行解密,其参数为要解密的数据。
Function Decrypt
    Parameter EncryptionString  && EncryptionString为要解密的数据
    Decrypt = ""
    = Rand(100001)
    n = 0
    Do While n < 8   &&此处8为随机密钥的长度
        x = HexVal(EncryptionString, 2 * n + 1)
        = Rand(Int(Rand() * x) + 1)
        n = n + 1
    Enddo
    l = Len(Rtrim(EncryptionString))
    Do While n < l/2
        x = HexVal(EncryptionString, 2 * n + 1)
        x = Bitxor(Int(Rand() * 255), x)
        Decrypt = Decrypt + Chr(x)
        n = n + 1
    Enddo
Return Decrypt
Function HexVal  &&将十六进制字符转换为十进制数值
    Parameter x, n
    x1 = Substr(x, n, 1)
    x2 = Substr(x, n + 1, 1)
    Do Case
        Case Between(x1,'0','9')
            x1Val = Asc(x1) - 48
        Case Between(x1,'A','F')
            x1Val = Asc(x1) - 65 + 10
    EndCase
    Do Case
        Case Between(x2,'0','9')
            x2Val = Asc(x2) - 48
        Case Between(x2,'A','F')
            x2Val = Asc(x2) - 65 + 10
    EndCase
    HexVal = x1Val * 16 + x2Val
Return HexVal

4 小结

本文中所给出的随机加密程序代码,经过简单的修改后,可变换出多种加密程序。也可以将程序移植到其他程序语言中。
对于利用随机加密算法加密的数据,使用常规的方法一般是很难破解的。破解随机加密算法加密的数据,必须采用类似文中所给的程序来进行破解。因此,加密效果的好坏,取决于加密的算法程序是否安全。
参考文献
[1] Microsoft Corporation. Microsoft MSDN Library [Z], Microsoft Corporation,2000.
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭