简单的加密解密问题??

tagger 2002-04-01 04:54:03
我作简单的用户管理,需对用户的密码加密,解密,怎实现?
最好有例程! 先谢!!
...全文
326 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyjcsdn 2002-12-25
  • 打赏
  • 举报
回复
我要liubbc@sina.com
ccycc 2002-04-02
  • 打赏
  • 举报
回复
另外本人手里还有Crypto++ 3.0加密库源代码,需要的留下Email
ccycc 2002-04-02
  • 打赏
  • 举报
回复
另外还有补充,兄弟应该能够解决你的问题了吧。

对 “用CryptoAPI进行数据加密”一文的补充
武汉 程义军

--------------------------------------------------------------------------------

---- 读了贵刊2000年第19期B16版“用CryptoAPI进行数据加密”一文,觉得很有所获,急忙将其键入,编译、运行,却出现了错误。当然,并不是原文提供的代码有错,而是原文的作者忽略了一个重要的问题。如果你的机器曾运行过这种数据加密程序,那当然可以正确地运行。如果是第一次才运行此程序,那将会出现问题,错误就在 CryptAcquireContext的调用上。

----在调用CryptEncrypt进行数据加密之前,需要取得当前机器缺省的密钥容器,而CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0)就是用于连接缺省的CSP的,如果当前机器未曾设置过缺省的密钥容器, CryptAcquireContext 调用就会出错。因此必须为机器创建缺省的密钥容器。

----创建缺省的密钥容器也需要调用CryptoAPI进行。下面介绍一种创建缺省的密钥容器的控制台程序InitUser.c。本程序的功能为:

用你的机器名称UserName创建一个缺省的密钥容器。
在密钥容器中创建一个数字签名密钥对。
在密钥容器中创建一个密钥交换对。
----本程序在一台机器上只须执行一次,执行之后,你将会看到在系统注册表的HKEY_CURRENT_USER\Software\microsoft下多了一个主键: Cryptography\UserKeys,并填入一些十六进制的值。之后,你就可以顺利地使用数据加密程序了,甚至可以使用数字签名了。

----程序清单:

< InitUser.c >
#include < windows.h >
#include < stdio.h >
#include < stdlib.h >
#include < wincrypt.h >
//主程序不需要任何参数
void _cdecl main(void)
{
HCRYPTPROV hProv;
HCRYPTKEY hKey;
CHAR szUserName[100];
DWORD dwUserNameLen = 100;
// 试图获取缺省的密钥容器,
若失败,则创建一个缺省容器
if(!CryptAcquireContext(&hProv, NULL,
MS_DEF_PROV, PROV_RSA_FULL, 0))
{
//若获取缺省密钥容器发生错误,
就创建一个缺省密钥容器, 使用参数
CRYPT_NEWKEYSET if(!CryptAcquireContext
(&hProv,NULL,MS_DEF_PROV,
PROV_RSA_FULL,CRYPT_NEWKEYSET))
{
printf(“创建缺省密钥容器发生错误!\n");
exit(1);
}
// 取得缺省密钥容器名
if(!CryptGetProvParam(hProv, PP_CONTAINER,
szUserName, &dwUserNameLen, 0)) {
// 出错误时容器名置空
szUserName[0] = 0;
}
printf(“Create key container ‘%s'\n",szUserName);
}
// 试图获取签名密钥的名柄
if(!CryptGetUserKey(hProv, AT_SIGNATURE, &hKey))
{
if(GetLastError() == NTE_NO_KEY)
{ // 创建数字签名密钥对
printf(“Create signature key pair\n");
if(!CryptGenKey(hProv,AT_SIGNATURE,0,&hKey))
{
printf(“错误代码: %x 创建数字签名
密钥对发生错误!\n", GetLastError());
exit(1);
}
else
{
CryptDestroyKey(hKey);
}
}
else
{
printf(“错误代码: %x during
CryptGetUserKey!\n", GetLastError());
exit(1);
}
}
// 试图取得交换密钥的句柄,
没有交换密钥时,创建交换密钥
if(!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKey))
{
if(GetLastError()==NTE_NO_KEY)
{//没有交换密钥时,创建交换密钥对
printf(“创建交换密钥\n");
if(!CryptGenKey(hProv,AT_KEYEXCHANGE,0,&hKey))
{
printf(“Error %x during CryptGenKey!\n", GetLastError());
exit(1);
}
else
{
CryptDestroyKey(hKey);
}
}
else
{
printf(“Error %x duringCryptGetUserKey!\n", GetLastError());
exit(1);
}
}
CryptReleaseContext(hProv,0); //释放句柄
printf(“OK\n");
exit(0);
}

----以上程序在WinNT4.0及Win98、VC5++上编译通过,机器环境为赛扬333。若编译时发生HCRYPTPROV、HCRYPTKEY类型等错误,请打开 vc\include\wincrypt.h,将其头部的#if(_WIN32_WINNT >= 0x0400)及尾部的#endif /* _WIN32_WINNT >= 0x0400 */两行注释掉,存盘,即可编译成功。
ccycc 2002-04-02
  • 打赏
  • 举报
回复
用CryptoAPI进行数据加密
南京理工大学计算机系 胡静 李蔚清

--------------------------------------------------------------------------------

---- 由于过于复杂的加密算法实现起来非常困难,所以在过去,许多应用程序只能使用非常简单的加密技术,这样做的结果就是加密的数据很容易被人破译。而使用Microsoft提供的加密应用程序接口(即Cryptography API),或称CryptoAPI,可以方便地在应用程序中加入强大的加密功能,而不必考虑基本的算法。本文将对CryptoAPI及其使用的数据加密原理作一简单的介绍,然后给出了用CryptoAPI编写加密程序的大致步骤,最后以一个文件的加密、解密程序为例演示CryptoAPI的部分功能。

1. CryptoAPI简介
---- CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。 CryptoAPI的体系结构如图1。


----目前支持CryptoAPI的Windows系统有:Windows 95 OSR2、Windows NT SP3及后续版本、Windows 98、Windows 2000等。CryptoAPI的配置信息存储在注册表中,包括如下密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\ Cryptography \Defaults
HKEY_CURRENT_USER\ Software \ Microsoft
\ Cryptography \Providers

2.数据加密原理
---- 数据加密流程如图2所示。


----CryptoAPI使用两种密钥:会话密钥与公共/私人密钥对。会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递。公共/私人密钥对使用一个公共密钥和一个私人密钥,私人密钥只有专人才能使用,公共密钥可以广泛传播。如果密钥对中的一个用于加密,另一个一定用于解密。公共/私人密钥对算法很慢,一般只用于加密小批量数据,例如用于加密会话密钥。

----CryptoAPI支持两种基本的编码方法:流式编码和块编码。流式编码在明码文本的每一位上创建编码位,速度较快,但安全性较低。块编码在一个完整的块上(一般为64位)工作,需要使用填充的方法对要编码的数据进行舍入,以组成多个完整的块。这种算法速度较慢,但更安全。

3.应用举例
----下面以两个文件加密与解密的C程序片断为例,演示一下CryptoAPI的强大功能。这两个程序均为Win32控制台应用,程序省略了出错处理,实际运行时请加入。
----1. 文件加密

#include
#include
#include
#include

//确定使用RC2块编码或是RC4流式编码
#ifdef USE_BLOCK_CIPHER
#define ENCRYPT_ALGORITHM CALG_RC2
#define ENCRYPT_BLOCK_SIZE 8
#else
#define ENCRYPT_ALGORITHM CALG_RC4
#define ENCRYPT_BLOCK_SIZE 1
#endif

void CAPIDecryptFile(PCHAR szSource,
PCHAR szDestination, PCHAR szPassword);

void _cdecl main(int argc, char *argv[])
{
PCHAR szSource = NULL;
PCHAR szDestination = NULL;
PCHAR szPassword = NULL;

// 验证参数个数
if(argc != 3 && argc != 4) {
printf(“USAGE: decrypt < source file >
< dest file > [ ]\n");
exit(1);
}

//读取参数.
szSource = argv[1];
szDestination = argv[2];
if(argc == 4) {
szPassword = argv[3];
}
CAPIDecryptFile(szSource, szDestination, szPassword);
}

/*szSource为要加密的文件名称,
szDestination为加密过的文件名称,
szPassword为加密口令*/
void CAPIEncryptFile(PCHAR szSource,
PCHAR szDestination, PCHAR szPassword)
{
FILE *hSource = NULL;
FILE *hDestination = NULL;
INT eof = 0;
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hXchgKey = 0;
HCRYPTHASH hHash = 0;
PBYTE pbKeyBlob = NULL;
DWORD dwKeyBlobLen;
PBYTE pbBuffer = NULL;
DWORD dwBlockLen;
DWORD dwBufferLen;
DWORD dwCount;

hSource= fopen(szSource,“rb"));// 打开源文件
hDestination = fopen(szDestination,“wb") ;//.打开目标文件
// 连接缺省的CSP
CryptAcquireContext(&hProv, NULL, NULL,
PROV_RSA_FULL, 0));
if(szPassword == NULL) {
//口令为空,使用随机产生的会话密钥加密
// 产生随机会话密钥。
CryptGenKey(hProv, ENCRYPT_ALGORITHM,
CRYPT_EXPORTABLE, &hKey)
// 取得密钥交换对的公共密钥
CryptGetUserKey(hProv, AT_KEYEXCHANGE,
&hXchgKey);
// 计算隐码长度并分配缓冲区
CryptExportKey(hKey, hXchgKey,
SIMPLEBLOB, 0, NULL, &dwKeyBlobLen);
pbKeyBlob=malloc(dwKeyBlobLen)) == NULL) ;
// 将会话密钥输出至隐码
CryptExportKey(hKey, hXchgKey,
SIMPLEBLOB, 0, pbKeyBlob, &dwKeyBlobLen));
// 释放密钥交换对的句柄
CryptDestroyKey(hXchgKey);
hXchgKey = 0;
// 将隐码长度写入目标文件
fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, hDestination);
//将隐码长度写入目标文件
fwrite(pbKeyBlob,1,dwKeyBlobLen, hDestination);
} else {
//口令不为空, 使用从口令派生出的密钥加密文件
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
// 建立散列表
CryptHashData(hHash, szPassword, strlen(szPassword), 0);
//散列口令
// 从散列表中派生密钥
CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey);
// 删除散列表
CryptDestroyHash(hHash);
hHash = 0;
}

//计算一次加密的数据字节数,
必须为ENCRYPT_BLOCK_SIZE的整数倍
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
//如果使用块编码,则需要额外空间
if(ENCRYPT_BLOCK_SIZE > 1) {
dwBufferLen=dwBlockLen + ENCRYPT_BLOCK_SIZE;
} else {
dwBufferLen = dwBlockLen;
}
//分配缓冲区
pbBuffer = malloc(dwBufferLen);
//加密源文件并写入目标文件
do {
// 从源文件中读出dwBlockLen个字节
dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
eof = feof(hSource);
//加密数据
CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, dwBufferLen);
// 将加密过的数据写入目标文件
fwrite(pbBuffer, 1, dwCount, hDestination);
} while(!feof(hSource));
printf("OK\n");
......//关闭文件、释放内存
}

----2 文件解密

void CAPIDecryptFile(PCHAR szSource,
PCHAR szDestination, PCHAR szPassword)
{
......//变量声明、文件操作同文件加密程序

CryptAcquireContext(&hProv, NULL, NULL,
PROV_RSA_FULL, 0);
if(szPassword == NULL) {
// 口令为空,使用存储在加密文件中的会话密钥解密
// 读隐码的长度并分配内存
fread(&dwKeyBlobLen,sizeof(DWORD),1,hSource);
pbKeyBlob=malloc(dwKeyBlobLen))== NULL);
// 从源文件中读隐码.
fread(pbKeyBlob, 1, dwKeyBlobLen, hSource);
// 将隐码输入CSP
CryptImportKey(hProv, pbKeyBlob,
dwKeyBlobLen, 0, 0, &hKey);
} else {
// 口令不为空, 使用从口令派生出的密钥解密文件
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CryptHashData(hHash, szPassword, strlen
(szPassword), 0);
CryptDeriveKey(hProv, ENCRYPT_ALGORITHM,
hHash, 0, &hKey);
CryptDestroyHash(hHash);
hHash = 0;
}

dwBlockLen=1000-1000%ENCRYPT_BLOCK_SIZE;
if(ENCRYPT_BLOCK_SIZE > 1) {
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
} else {
dwBufferLen = dwBlockLen;
}
pbBuffer = malloc(dwBufferLen);

//解密源文件并写入目标文件
do {
dwCount = fread(pbBuffer, 1, dwBlockLen,
hSource);
eof = feof(hSource);
// 解密数据
CryptDecrypt(hKey, 0, eof, 0, pbBuffer, &dwCount);
// 将解密过的数据写入目标文件
fwrite(pbBuffer, 1, dwCount, hDestination);
} while(!feof(hSource));
printf(“OK\n");
......//关闭文件、释放内存
}

----以上代码在Windows NT4.0、Visual C++6.0环境中编译通过。

----除直接用于加密数据外,CryptoAPI还广泛用于产生并确认数字签名,这里就不一一举例说明了,有兴趣的读者可以参考MSDN文档。

tagger 2002-04-01
  • 打赏
  • 举报
回复
#include < wincrypt.h >
void CQqqDlg::OnButton1()
{
// TODO: Add your control notification handler code here
char * cuser="useruser";
char *pass="123qwe";
PCHAR szSource= cuser;
PCHAR szDestination = NULL;
PCHAR szPassword= pass;

CAPIFile(szSource, szDestination, szPassword);

}
typedef unsigned long HCRYPTPROV;
typedef unsigned long HCRYPTHASH;

typedef unsigned long HCRYPTKEY;
void CQqqDlg::CAPIFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword)
{
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hXchgKey = 0;
HCRYPTHASH hHash = 0;
PBYTE pbKeyBlob = NULL;
DWORD dwKeyBlobLen;
PBYTE pbBuffer = NULL;
DWORD dwBlockLen;
DWORD dwBufferLen;
DWORD dwCount;
CryptAcquireContext(&hProv, NULL,NULL,PROV_RSA_FULL, 0);
//口令不为空, 使用从口令派生出的密钥加密文件
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
// 建立散列表
CryptHashData(hHash, szPassword, strlen(szPassword), 0);
// 从散列表中派生密钥
CryptDeriveKey(hProv, ENCRYPT_ALGORITHM, hHash, 0, &hKey);
// 删除散列表
CryptDestroyHash(hHash);
hHash = 0;


//计算一次加密的数据字节数,必须为ENCRYPT_BLOCK_SIZE的整数倍
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
//如果使用块编码,则需要额外空间
if(ENCRYPT_BLOCK_SIZE > 1) {
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
} else {
dwBufferLen = dwBlockLen;
}
//分配缓冲区
pbBuffer = malloc(dwBufferLen);
//加密源文件并写入目标文件
// 从源文件中读出dwBlockLen个字节
strcpy(pbBuffer,szSource);
//加密数据
CryptEncrypt(hKey, 0, 1, 0, pbBuffer,&dwCount, dwBufferLen);
// 将加密过的数据写入目标文件
// fwrite(pbBuffer, 1, dwCount,hDestination );
//strcpy(,);
printf("OK\n");
}
编译通不过...........,why??????
dy_paradise 2002-04-01
  • 打赏
  • 举报
回复
向高手学习
baoch110 2002-04-01
  • 打赏
  • 举报
回复
特别说明一下myWINCRYPT.H头文件就是WINCRYPT.H文件,应为我用的是九八
注释掉了他的〉NT4限制,不过仍然在九八下可以使用,加密解密不受限制

为了不影响别的程序,自己复制了一个WINCRYPT.H文件,冲命名为myWINCRYPT.H

baoch110 2002-04-01
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "CAPIDLL.h"

#include "myWINCRYPT.h"

#ifdef USE_BLOCK_CIPHER
// 定义RC2算法分块大小
#define ENCRYPT_ALGORITHM CALG_RC2
#define ENCRYPT_BLOCK_SIZE 8
#else
//定义RC4算法分块大小
#define ENCRYPT_ALGORITHM CALG_RC4
#define ENCRYPT_BLOCK_SIZE 1
#endif
__declspec (dllexport) char* CAPIEncryptData(char * bSecrect,DWORD SecrectLen)
{
typedef unsigned char byte;


HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;

PBYTE pbBuffer = NULL;
DWORD dwBlockLen;
DWORD dwBufferLen;


BOOL status = FALSE;
BOOL eof=FALSE;

int con=0;
int i=0;


//关联加密服务
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
Error("Error during CryptAcquireContext!");
goto done;
}
//创建一个密匙
if (!CryptGenKey(hProv, ENCRYPT_ALGORITHM, CRYPT_EXPORTABLE, &hKey))
{
Error("Error during CryptGenKey!");
goto done;
}



dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;


// 判断分块大小,不足数据长度的要补够长度
if (ENCRYPT_BLOCK_SIZE > 1)
{
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
}
else
{
dwBufferLen = dwBlockLen;
}
//分派内存

if ((pbBuffer = (PBYTE)malloc(dwBufferLen)) == NULL)
{
Error("Out of memory!");
goto done;
}

//判断结束标志,eof为TRUE表示结束
if (ENCRYPT_BLOCK_SIZE>1)
{
if (SecrectLen%ENCRYPT_BLOCK_SIZE==0)
{
con=SecrectLen/ENCRYPT_BLOCK_SIZE;
}
else
{
con=(SecrectLen-SecrectLen%ENCRYPT_BLOCK_SIZE)/ENCRYPT_BLOCK_SIZE+1;
}
}
else
{
con=SecrectLen;
}

for(i=0;i<con;i++)
{
if (i=con)
{
eof=TRUE;
}

// 加密数据
if (!CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &SecrectLen, dwBufferLen))
{
Error("Error during CryptEncrypt!");
goto done;
}
}

return (char *)pbBuffer;


done:

// 释放内存

if (pbBuffer) free(pbBuffer);

// 释放密匙
if (hKey) CryptDestroyKey(hKey);

// 释放句柄
if (hProv) CryptReleaseContext(hProv, 0);


}


__declspec (dllexport) char* CAPIDecryptData(char * bSecrect,DWORD SecrectLen)
{
typedef unsigned char byte;

HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;

PBYTE pbBuffer = NULL;
DWORD dwBlockLen;
DWORD dwBufferLen;

BOOL status = FALSE;
BOOL eof=FALSE;

int con=0;
int i;

//连接加密服务
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
Error("Error during CryptAcquireContext!");
goto done;
}
//确定分快
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
//dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;

if (ENCRYPT_BLOCK_SIZE > 1)
{
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
}
else
{
dwBufferLen = dwBlockLen;
}

// 分配内存
if ((pbBuffer = (PBYTE)malloc(dwBufferLen)) == NULL)
{
Error("Out of memory!");
goto done;
}


//判断结束标志
if (ENCRYPT_BLOCK_SIZE>1)
{
if (SecrectLen%ENCRYPT_BLOCK_SIZE==0)
{
con=SecrectLen/ENCRYPT_BLOCK_SIZE;
}
else
{
con=(SecrectLen-SecrectLen%ENCRYPT_BLOCK_SIZE)/ENCRYPT_BLOCK_SIZE+1;
}
}
else
{
con=SecrectLen;
}

for(i=0;i<con;i++)
{
if (i=con)
{
eof=TRUE;
}



// 数据解密
if (!CryptDecrypt(hKey, 0, eof, 0, pbBuffer, &SecrectLen))
{

Error("Error during CryptDecrypt!");
goto done;
}
}
//status=TRUE;


done:

//释放内存
if (pbBuffer) free(pbBuffer);

// 释放密匙
if (hKey) CryptDestroyKey(hKey);

// 释放句柄
if (hProv) CryptReleaseContext(hProv, 0);

//return (status);
return (char *)pbBuffer;

}
以上是我写的一段加密解密的dll函数,用别的程序可以调用的
ydogg 2002-04-01
  • 打赏
  • 举报
回复
兄弟,顶楼的还要解密,他要求管理,不是验证

另:md5算法本来就是公开的
Colin-Han 2002-04-01
  • 打赏
  • 举报
回复
不可逆的才更安全,只需要将用户输入的密码进行相同的转换后比较结果就可以了,即使算法公开一可以保证密码的安全性!

推荐MD5
ydogg 2002-04-01
  • 打赏
  • 举报
回复
md5算法是不可逆的,不符合你的要求
elc 2002-04-01
  • 打赏
  • 举报
回复
hehe
学学
ccycc 2002-04-01
  • 打赏
  • 举报
回复
1、如果使用ACCESS库,选择“文本”格式有“输入掩码”一项。其他数据库不知有否。比较时用rsUserInfo("password")=mistake(strPassword)语句即可。
2、自己编写加密模块,简单的移位/与/或操作,网上有Javascript的源程序。
3、下载加密/解密ActiveX控件。自己寻找,如果只是用作用户密码加密有点
牛刀了。
4、crypto api2.0 参考: http://www2.ccw.com.cn/tips/2k06/062001_09.asp或在MSDN中查寻。
LLnju 2002-04-01
  • 打赏
  • 举报
回复
DES : Data Encryption Standard.
IDEA : International Data Encryption Algorithm.

CryptAPI 难用死了,不如下载一个加密库,还有源程序。
tagger 2002-04-01
  • 打赏
  • 举报
回复
DES 全称是什么 ?
在VC中可用,对吧!!
VC 中<wincrypt.h> API 好用吗?
LLnju 2002-04-01
  • 打赏
  • 举报
回复
对密码当然是用散列了,绝大部分的密码验证的都用散列,就是用一些加密算法的其实也往往是用加密算法来作为一种散列方法来使用的,象使用 8 次DES对0加密其实也是散列。
用 DES 还不如用 IDEA,GOST,3Way,RC2,RC4等, 说安全性 DES 还是太老了,用来作为密码验证,安全性比用 MD5 差,用 3DES 还行。
源码到 http://www.cryptopp.com 下载去。
Kaile 2002-04-01
  • 打赏
  • 举报
回复
md5,sha是摘要,老兄,这种加密用DES合适,去网上下载DES的源程序,就几个函数,而且安全性比较高,(除了美国国家安全局等少数机构外,绝对安全)
tagger 2002-04-01
  • 打赏
  • 举报
回复
例程?????
greenery 2002-04-01
  • 打赏
  • 举报
回复
CryptApi最好
LLnju 2002-04-01
  • 打赏
  • 举报
回复
对密码加密用 MD5 ,SHA 什么的最好
加载更多回复(1)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧