65.9K
CodeProject 正在变化。 阅读更多。
Home

RC4 算法在 COM 组件中

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.25/5 (5投票s)

2005年7月8日

2分钟阅读

viewsIcon

56067

downloadIcon

1433

使用 C++ 和 ATL 创建的 COM 组件中的 RC4 算法。

引言

安全存储组件是使用 ATL 创建的 COM 组件。该组件封装了 RC4 流密码算法,该算法放置在单独的源文件和头文件中(rc4.cpprc4.h 文件)。

基本上,该组件是根据存储凭据的需求而创建的,目的是使其对人眼不可读。 当决定使用 RC4 算法时,已知它不是选择的最强大的加密算法,但它需要是一种相对快速的加密算法。 该算法可以改进。 通过将其更改为使用分组密码,可以实现这一点。

在使用 RC4 算法时,显而易见的是,它将返回与明文长度相同的密文。 这是该算法的一个明显缺点。 可以通过在加密之前填充明文来改进这一点。

在可以进行加密之前,有必要设置要用于执行加密的密钥。 这通过使用以下签名的方法来完成

prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key)

该方法接收文本密钥(密码短语)及其长度,并返回指向 struct 的指针,该指针是“实际”的 RC4 加密密钥。 在生成密钥后,我们就可以执行加密了。 加密是通过使用以下签名的方法完成的

void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key)

它将明文及其长度(明文)作为输入参数,以及我们之前创建的 RC4 加密密钥。 该方法在与用于明文的相同指针中返回密文。

使用代码

这两种方法(如前所述)封装在 ATL COM 组件中。 该组件具有两种类型的接口:一种仅在返回时返回加密/解密的结果。

set obj = CreateObject("SECURESTORAGE.Secure")
cipher = obj.Encrypt ("encryption key or pass phrase", "a value to be stored")
MsgBox (obj.Decrypt ("encryption key or pass phrase", cipher))

另一种将密文存储在注册表数据库中。 密文稍后可以在第二次往返中获取。

set obj = CreateObject("SECURESTORAGE.Secure")
obj.RegistryKey = "registry key"
obj.EncryptToRegistry "encryption key or pass phrase", _
                  "registry key", "a value to be stored"
clear = obj.DecryptFromRegistry("encryption key or pass phrase", "registry key")
MsgBox clear

注册表中的值存储在 KEY_LOCAL_MACHINE\SOFTWARE\SecureStorage 下。 如果提供了注册表键,则值将在 SecureStorage 键下存储在该键下。

关注点

在使用 RC4 时,显而易见的是,在 rc4 方法之前始终必须使用 prepare_key 方法。 此外,请注意,我使用与加密相同的方法进行解密。 这是可能的,因为它是一种对称密钥加密算法。

© . All rights reserved.