首页
社区
课程
招聘
[求助]C#与C++算法问题。DES
发表于: 2010-8-29 08:59 13476

[求助]C#与C++算法问题。DES

2010-8-29 08:59
13476

using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
//默认密钥向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/**//// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string EncryptDES(string encryptString, string encryptKey)
{
    try
     {
        byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
        byte[] rgbIV = Keys;
        byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
         DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
         MemoryStream mStream = new MemoryStream();
         CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
         cStream.Write(inputByteArray, 0, inputByteArray.Length);
         cStream.FlushFinalBlock();
        return Convert.ToBase64String(mStream.ToArray());
     }
    catch
     {
        return encryptString;
     }
}

/**//// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string DecryptDES(string decryptString, string decryptKey)
{
    try
     {
        byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
        byte[] rgbIV = Keys;
        byte[] inputByteArray = Convert.FromBase64String(decryptString);
         DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
         MemoryStream mStream = new MemoryStream();
         CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
         cStream.Write(inputByteArray, 0, inputByteArray.Length);
         cStream.FlushFinalBlock();
        return Encoding.UTF8.GetString(mStream.ToArray());
     }
    catch
     {
        return decryptString;
     }
}

请问上面的C#用C++写出加解密怎么写?在网上下的DES解不开。。
base64也不行。
或者有没有什么对称加密算法,可以C++、C#同时实现的。。。
谢谢!


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是发错版块了。
知道的大牛帮忙看看。。
2010-8-29 09:45
0
雪    币: 1137
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
不太明白楼主的意思
1:上面的C#代码有两个方法,一个加密一个解密,密钥在传参的时候要一样,如果用EncryptDES()加密,用DecryptDES()再去解密,解不出,那就是代码有问题,建议在找下其代码,网上很多的。
2:如果楼主手上有一段Des加密后的密文,想自己写Des解密,那就必须知道密钥,还有一点就是Des的变形也比较多。如果密钥不知道,那就.... ,如果des变形了,那就需要楼主自己去跟他的加密过程,看看是怎么变形的....

Des在加密的时候有几种填充模式,还有几种对称加密模式,还有3重Des...呵呵

具体我也不怎么懂,楼主可以多搜搜相关资料看一看
2010-8-29 16:33
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
注意检查字符编码,工作模式,初始向量。应该可以解决你的问题了。
2010-8-29 17:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最近正在学C++
2010-9-1 08:34
0
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
6
估计QQ上合csdn上也是你问的吧..一起回答了
#define _WIN32_WINNT  0x0400
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>

#pragma comment( lib, "Advapi32.lib" )

//
// for DES
//

typedef struct
{
        BLOBHEADER header;
        DWORD cbKeySize;
        BYTE rgbKeyData[8];
}KeyBlob;

LPSTR ConvertGBKToUtf8( LPSTR strGBK )
{
        int len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)strGBK, -1, NULL,0);
        unsigned short * wszUtf8 = new unsigned short[len+1];
        memset( wszUtf8, 0, len * 2 + 2 );
        MultiByteToWideChar( CP_ACP, 0, (LPSTR)strGBK, -1, wszUtf8, len );
       
        len = WideCharToMultiByte( CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL );
        char *szUtf8=new char[len + 1];
        memset( szUtf8, 0, len + 1 );
        WideCharToMultiByte ( CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL );
       
        return szUtf8;
}

void Base64Encode(BYTE *src, int src_len, BYTE *dst)
{
       
        int i = 0, j = 0;
       
        char base64_map[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
       
        for (; i < src_len - src_len % 3; i += 3) {
               
                dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
               
                dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
               
                dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];
               
                dst[j++] = base64_map[src[i + 2] & 0x3F];
               
        }
       
        if (src_len % 3 == 1) {
               
                dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
               
                dst[j++] = base64_map[(src[i] << 4) & 0x30];
               
                dst[j++] = '=';
               
                dst[j++] = '=';
               
        }else if (src_len % 3 == 2) {
               
                dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
               
                dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
               
                dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];
               
                dst[j++] = '=';
               
        }
       
        dst[j] = '\0';
       
}

DWORD DesEncrypt(char* szEncrypt, char* szKey, BYTE* szOut, DWORD nOutLen)
{
        char* sz_utf8_buff = ConvertGBKToUtf8( szEncrypt );
       
    DWORD dwEncrypt = strlen(sz_utf8_buff);
       
    if( szOut == NULL || \
                nOutLen < dwEncrypt + 8 - (dwEncrypt % 8) || \
                strlen( szKey ) < 8)
                return 0;
    memcpy(szOut, sz_utf8_buff, dwEncrypt);
       
        //
        // init
        //

    HCRYPTPROV hProv = NULL;
    HCRYPTKEY hSessionKey = NULL;
    BOOL bResult = TRUE;

    KeyBlob blob;
    blob.header.bType = PLAINTEXTKEYBLOB;
    blob.header.bVersion = CUR_BLOB_VERSION;
    blob.header.reserved = 0;
    blob.header.aiKeyAlg = CALG_DES;
    blob.cbKeySize = 8;
    memcpy(blob.rgbKeyData, szKey, 8);

        BYTE IV[9] = {0};
        memcpy( IV, szKey, 8 );
       
        //
        // start
        //

    CryptAcquireContext(&hProv,NULL, MS_DEF_PROV, PROV_RSA_FULL,0);
    CryptImportKey(hProv, (BYTE*)&blob, sizeof(blob), 0, 0, &hSessionKey);
    CryptSetKeyParam(hSessionKey, KP_IV, (BYTE*)IV, 0);
       
        //
        // Do
        //

    CryptEncrypt(hSessionKey, NULL, TRUE, 0, (BYTE*)szOut, &dwEncrypt, nOutLen);
       
        //
        // Clean
        //

    CryptDestroyKey(hSessionKey);
    CryptReleaseContext(hProv, 0);
        delete sz_utf8_buff;

    return dwEncrypt;
}

char* Encrypt( char* sz_encrypt, char* sz_key )
{
        BYTE szOut[1024] = {0};
       
        //
        // do Des crypt
        //
       
        DWORD dwRet = DesEncrypt( sz_encrypt, sz_key, szOut, 1024 );

        //
        // do base64
        //

        int nLen = strlen( (char*)szOut );
        int nLenOut = nLen * 4 / 3;
        BYTE* szBase64 = new BYTE[nLenOut+1];

        memset( szBase64, 0, nLenOut + 1 );

        Base64Encode( szOut, nLen, szBase64 );
       
        return (char*)szBase64;
}

int main(int argc, char* argv[])
{
       
        char* szResoult = Encrypt( "22222222", "22222222" );
        printf( "%s\n", szResoult);
        delete szResoult;
        return 0;
}
2010-9-19 16:36
0
游客
登录 | 注册 方可回帖
返回
//