100分 求数据加密 --急

时间:2021-06-08 17:52:02
现有用户的密码字段,当将见面上Edit_Password->Text插入数据库时作加密运算,加密后再保存到数据库,如果修改密码就要将密码还原过来。
如:123456789是密码,插入数据库后看到的是一串乱码,但读取出来还是123456789

注:不要太复杂,如密码为123456插入数据库后不要是654321就行。

此问题很急,请大家速给帮个忙解决。

8 个解决方案

#1


DES的
typedef        unsigned char byte;

void Des_Bit2Byte(byte *, byte *);
void Des_Byte2Bit(byte *, byte *);
void Des_DesEncry(byte *, byte *);
void Des_DesDecry(byte *, byte *);
void Des_TransPose(byte *, byte *, int);
void Des_Process(int, byte *, byte *, byte *, byte);
void Des_Lshift(byte *, byte);
void Des_Rshift(byte *, byte);

unsigned char Des_Table0[] = {
          58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,
          62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,
          57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,
          61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7};
unsigned char Des_Table1[] = {
          57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,
          59,51,43,35,27,19,11, 3,60,52,44,36,63,55,47,39,
          31,23,15, 7,62,54,46,38,30,22,14, 6,61,53,45,37,
          29,21,13, 5,28,20,12, 4};
unsigned char Des_Table2[] = {
          14,17,11,24, 1, 5, 3,28,15, 6,21,10,23,19,12, 4,
          26, 8,16, 7,27,20,13, 2,41,52,31,37,47,55,30,40,
          51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};
unsigned char Des_Table3[] = {
          40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
          38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
          36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
          34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25};
unsigned char Des_Table4[] = {
          32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,10,11,
          12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,
          22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1};
unsigned char Des_Table5[] = {
          1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char Des_Table6[] = {
          0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char Des_Table7[] = {
          16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
          2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25};
unsigned char Des_Table8[][64] = {
         {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
          0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
          4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
          15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13},
         {15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
          3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
          0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
          13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9},
         {10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
          13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
          13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
          1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12},
         {7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
          13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
          10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
           3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14},
         {2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
           14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
           4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
           11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3},
         {12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
          10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
          9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
          4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13},
         {4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
          13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
          1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
          6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12},
         {13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
          1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
          7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
          2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11}};

/*
函数功能:根据指定的密钥进行加密,将密文填回原始的字符
传入参数:
  data : 原始的字符
  key  : 密钥
返回参数:
*/
void DES_Encode(unsigned char * data, unsigned char * key)
{
byte data_text[64], key_text[64];

  Des_Bit2Byte(data, data_text);
  Des_Bit2Byte(key, key_text);
  Des_DesDecry(data_text, key_text);
  Des_Byte2Bit(data_text, data);
  return;
}

void DES_Encode(unsigned char * pdata,int length, unsigned char * key)
{
int id;

  for(id=0;id<length/8;id++)
    DES_Encode(pdata+id*8,key);
  return;
}

/*
函数功能:根据指定的密钥解密密文,将原始的字符填传回到密文对应的地址
传入参数:
  data : 密文
  key  : 密钥
返回参数:
*/
void DES_Decode(unsigned char * data, unsigned char * key)
{
byte data_text[64], key_text[64];

  Des_Bit2Byte(data, data_text);
  Des_Bit2Byte(key, key_text);
  Des_DesEncry(data_text, key_text);
  Des_Byte2Bit(data_text, data);
  return;
}

void DES_Decode(unsigned char * pdata, int length,unsigned char * key)
{
int id;

  for(id=0;id<length/8;id++)
    DES_Decode(pdata+8*id,key);
  return;
}

}

#2


void Des_Bit2Byte(byte *text1, byte *text2)
{
int  i_temp1, i_temp2;
byte mask, c_temp1;

  for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  {
    c_temp1 = text1[i_temp1];
    mask = 0x80;
    for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
    {
      if (c_temp1 & mask)
              text2[i_temp1 * 8 + i_temp2] = 1;
      else
              text2[i_temp1 * 8 + i_temp2] = 0;
      mask >>= 1;
    }
  };
  return;
}

void Des_Byte2Bit(byte *text1, byte *text2)
{
int  i_temp1, i_temp2;
byte mask;

  memset(text2, 0, 8);
  for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  {
    mask = 0x80;
    for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
    {
      if (text1[i_temp1 * 8 + i_temp2])
              text2[i_temp1] |= mask;
      mask >>= 1;
    }
  }
  return;
}

void Des_DesEncry(byte *text1, byte *key)
{
byte c_temp1[64], c_temp2[32];
int  i_temp1, i_temp2;

  Des_TransPose(text1, Des_Table0, 64);
  Des_TransPose(key, Des_Table1, 56);
  for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
  {
    memcpy(c_temp1, text1+32, 32);
    Des_Process(i_temp1, key, c_temp1, c_temp2, 'L');
    for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
      if (text1[i_temp2] == c_temp2[i_temp2])
        c_temp1[i_temp2 + 32] = 0;
      else
              c_temp1[i_temp2 + 32] = 1;
    memcpy(text1, c_temp1, 64);
  }
  memcpy(text1, c_temp1+32, 32);
  memcpy(text1+32, c_temp1, 32);
  Des_TransPose(text1, Des_Table3, 64);
  return;
}

void Des_DesDecry(byte *text1, byte *key)
{
byte c_temp1[64], c_temp2[32];
int  i_temp1, i_temp2;

  Des_TransPose(text1, Des_Table0, 64);
  memcpy(c_temp2, text1+32, 32);
  memcpy(text1+32, text1, 32);
  memcpy(text1, c_temp2, 32);
  Des_TransPose(key, Des_Table1, 56);
  for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
  {
    memcpy(c_temp1 + 32, text1, 32);
    Des_Process(i_temp1, key, c_temp1 + 32, c_temp2, 'R');
    for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
      if (text1[i_temp2 + 32] == c_temp2[i_temp2])
              c_temp1[i_temp2] = 0;
      else
              c_temp1[i_temp2] = 1;
    memcpy(text1, c_temp1, 64);
  }
  Des_TransPose(text1, Des_Table3, 64);
  return;
}

void Des_TransPose(byte *text, byte *table, int index)
{
byte c_temp1[64];
int  i_temp1;

  memcpy(c_temp1, text, 64);
  for (i_temp1 = 0; i_temp1 < index; i_temp1++)
    text[i_temp1] = c_temp1[table[i_temp1] - 1];
  return;
}

void Des_Process(int i, byte *key, byte *R32, byte *PB, byte flag)
{
byte extr32[48], extkey[56], c_temp1;
int  i_temp1;

  memcpy(extr32, R32, 32);
  Des_TransPose(extr32, Des_Table4, 48);

  if (toupper(flag) == 'L')
    Des_Lshift(key, Des_Table5[i]);
  else
    Des_Rshift(key, Des_Table6[i]);

  memcpy(extkey, key, 56);
  Des_TransPose(extkey, Des_Table2, 48);

  for (i_temp1 = 0; i_temp1 < 48; i_temp1++)
    if (extr32[i_temp1] == extkey[i_temp1])
      extr32[i_temp1] = 0;
    else
      extr32[i_temp1] = 1;

  for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  {
    c_temp1 = (byte)(extr32[i_temp1 * 6] * 32 +
             extr32[i_temp1 * 6 + 5] * 16 +
             extr32[i_temp1 * 6 + 1] *  8 +
             extr32[i_temp1 * 6 + 2] *  4 +
             extr32[i_temp1 * 6 + 3] *  2 +
             extr32[i_temp1 * 6 + 4]);
    c_temp1 = Des_Table8[i_temp1][c_temp1];
    if (c_temp1 >= 8)
    {
      PB[i_temp1 * 4] = 1;
      c_temp1 = (byte)(c_temp1 - 8);
    }
    else
      PB[i_temp1 * 4] = 0;
    if (c_temp1 >= 4)
    {
      PB[i_temp1 * 4 + 1] = 1;
      c_temp1 = (byte)(c_temp1 - 4);
    }
    else
      PB[i_temp1 * 4 + 1] = 0;
    if (c_temp1 >= 2)
    {
      PB[i_temp1 * 4 + 2] = 1;
      c_temp1 = (byte)(c_temp1 - 2);
    }
    else
      PB[i_temp1 * 4 + 2] = 0;
    if (c_temp1 >= 1)
      PB[i_temp1 * 4 + 3] = 1;
    else
      PB[i_temp1 * 4 + 3] = 0;
  }
  Des_TransPose(PB, Des_Table7, 32);
  return;
}

void Des_Lshift(byte *key, byte cnt)
{
byte c_temp1, c_temp2;
int  i_temp1,i_temp2;

  for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
  {
    c_temp1 = key[0];
    c_temp2 = key[28];
    for (i_temp1 = 0; i_temp1 < 55; i_temp1++)
      key[i_temp1] = key[i_temp1 + 1];
    key[27] = c_temp1;
    key[55] = c_temp2;
  }
  return;
}

void Des_Rshift(byte *key, byte cnt)
{
byte c_temp1, c_temp2;
int  i_temp1,i_temp2;

  for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
  {
    c_temp1 = key[27];
    c_temp2 = key[55];
    for (i_temp1 = 55; i_temp1 >0; i_temp1--)
      key[i_temp1] = key[i_temp1 - 1];
    key[0] = c_temp1;
    key[28] = c_temp2;
  }
  return;

#3


简单的,异或
#include <iostream> 
#include <stdio.h> 
#include <string.h> 

using namespace std; 

class encrypt 

public: 
encrypt(const char *); //构造函数,加密 
~encrypt(); 
void showcode(); 
void decrypt(); //解密 
private: 
char *code; 
int length; 
}; 

encrypt::encrypt(const char *string) 

int i=0; 
length=strlen(string);//获得原字符串的长度 
code=new char[length+1];// 加上结束符'\0' 
for(;i<length-1;i++) //从第一个字符开始,直到倒数第二个 

code[i]= string[i] ^ string[i+1]; //加密 

code[i]= string[i] ^ string[0];//i=length-1,最后一个字符 
//跟第一个字符做异或 

code[length] = '\0'; //加上结束符 



encrypt::~encrypt() 

delete[] code; 



void encrypt::showcode() 

for(int i=0;i<length;i++) 
printf("%1c",code[i]); //防止'\0',将字符逐个打出.不用iostream 
//iostream遇到'\0'会自动结束,,而加密过程中可能中间出现'\0',不该结束 


void encrypt::decrypt() 

char p; 
cout <<"\nThe First Character:"; 
cin >> p; 

code[length-1] ^= p; //最后一个字符跟第一个再次异或,得到原来的字符(两次异或,得到原值) 

for(int i=length-2; i>=0 ; i--) //从倒数第二个开始 

code[i]^=code[i+1]; //跟后面一个做异或,得原值 


cout<<"the original string is:" <<endl; 
showcode(); 
cout <<endl; 


int main() 

encrypt e("hello world!"); 
e.showcode(); 
e.decrypt(); 
return 0; 
}

#4


小弟刚学C++不久,还愿详细一点,现我的程序是窗口的形式,有个edt_password文本框,数据库中有个user表,表里有个password字段。
现我要将edt_password里的内容加密后放到password的字段中,然点再修改让password字段的内容显示到edt_password中,插入数据库是加密后的内容,读取出来要是解密后的内容,望兄弟给个这样的实际例子。

#5


直接把edt_password里的内容放到password的字段中你会不会?

#6


最简单的办法就是将各个位异或一下就可以了

#7


搞个函数就可以了,忘了是引用谁的了,不过可以用。
AnsiString encode(AnsiString *source)//异或加密,带钥匙加密,加密钥匙内部定义
{
  AnsiString astrEcode;
//用户专用密码,可以修改其中的5个密匙
  static const char i_userkey[5] = {0xab,0xbc,0xcb,0xde,0xef};
//开始加密/解密
  if(source->Length()>0)
   {
    for(int i=1; key=source->Length(); i<=key; i++)
      astrEcode = astrEcode + (char)(*source->substring(i,1).c_str() ^ (i+i_userkey[i%5));
  return astrEcode;
}
//解密的时候再调用这个函数就可以了。

#8


建议使用成熟的加密算法。

#1


DES的
typedef        unsigned char byte;

void Des_Bit2Byte(byte *, byte *);
void Des_Byte2Bit(byte *, byte *);
void Des_DesEncry(byte *, byte *);
void Des_DesDecry(byte *, byte *);
void Des_TransPose(byte *, byte *, int);
void Des_Process(int, byte *, byte *, byte *, byte);
void Des_Lshift(byte *, byte);
void Des_Rshift(byte *, byte);

unsigned char Des_Table0[] = {
          58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,
          62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,
          57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,
          61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7};
unsigned char Des_Table1[] = {
          57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,
          59,51,43,35,27,19,11, 3,60,52,44,36,63,55,47,39,
          31,23,15, 7,62,54,46,38,30,22,14, 6,61,53,45,37,
          29,21,13, 5,28,20,12, 4};
unsigned char Des_Table2[] = {
          14,17,11,24, 1, 5, 3,28,15, 6,21,10,23,19,12, 4,
          26, 8,16, 7,27,20,13, 2,41,52,31,37,47,55,30,40,
          51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};
unsigned char Des_Table3[] = {
          40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
          38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
          36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
          34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25};
unsigned char Des_Table4[] = {
          32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,10,11,
          12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,
          22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1};
unsigned char Des_Table5[] = {
          1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char Des_Table6[] = {
          0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char Des_Table7[] = {
          16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
          2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25};
unsigned char Des_Table8[][64] = {
         {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
          0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
          4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
          15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13},
         {15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
          3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
          0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
          13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9},
         {10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
          13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
          13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
          1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12},
         {7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
          13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
          10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
           3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14},
         {2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
           14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
           4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
           11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3},
         {12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
          10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
          9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
          4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13},
         {4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
          13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
          1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
          6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12},
         {13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
          1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
          7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
          2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11}};

/*
函数功能:根据指定的密钥进行加密,将密文填回原始的字符
传入参数:
  data : 原始的字符
  key  : 密钥
返回参数:
*/
void DES_Encode(unsigned char * data, unsigned char * key)
{
byte data_text[64], key_text[64];

  Des_Bit2Byte(data, data_text);
  Des_Bit2Byte(key, key_text);
  Des_DesDecry(data_text, key_text);
  Des_Byte2Bit(data_text, data);
  return;
}

void DES_Encode(unsigned char * pdata,int length, unsigned char * key)
{
int id;

  for(id=0;id<length/8;id++)
    DES_Encode(pdata+id*8,key);
  return;
}

/*
函数功能:根据指定的密钥解密密文,将原始的字符填传回到密文对应的地址
传入参数:
  data : 密文
  key  : 密钥
返回参数:
*/
void DES_Decode(unsigned char * data, unsigned char * key)
{
byte data_text[64], key_text[64];

  Des_Bit2Byte(data, data_text);
  Des_Bit2Byte(key, key_text);
  Des_DesEncry(data_text, key_text);
  Des_Byte2Bit(data_text, data);
  return;
}

void DES_Decode(unsigned char * pdata, int length,unsigned char * key)
{
int id;

  for(id=0;id<length/8;id++)
    DES_Decode(pdata+8*id,key);
  return;
}

}

#2


void Des_Bit2Byte(byte *text1, byte *text2)
{
int  i_temp1, i_temp2;
byte mask, c_temp1;

  for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  {
    c_temp1 = text1[i_temp1];
    mask = 0x80;
    for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
    {
      if (c_temp1 & mask)
              text2[i_temp1 * 8 + i_temp2] = 1;
      else
              text2[i_temp1 * 8 + i_temp2] = 0;
      mask >>= 1;
    }
  };
  return;
}

void Des_Byte2Bit(byte *text1, byte *text2)
{
int  i_temp1, i_temp2;
byte mask;

  memset(text2, 0, 8);
  for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  {
    mask = 0x80;
    for (i_temp2 = 0; i_temp2 < 8; i_temp2++)
    {
      if (text1[i_temp1 * 8 + i_temp2])
              text2[i_temp1] |= mask;
      mask >>= 1;
    }
  }
  return;
}

void Des_DesEncry(byte *text1, byte *key)
{
byte c_temp1[64], c_temp2[32];
int  i_temp1, i_temp2;

  Des_TransPose(text1, Des_Table0, 64);
  Des_TransPose(key, Des_Table1, 56);
  for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
  {
    memcpy(c_temp1, text1+32, 32);
    Des_Process(i_temp1, key, c_temp1, c_temp2, 'L');
    for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
      if (text1[i_temp2] == c_temp2[i_temp2])
        c_temp1[i_temp2 + 32] = 0;
      else
              c_temp1[i_temp2 + 32] = 1;
    memcpy(text1, c_temp1, 64);
  }
  memcpy(text1, c_temp1+32, 32);
  memcpy(text1+32, c_temp1, 32);
  Des_TransPose(text1, Des_Table3, 64);
  return;
}

void Des_DesDecry(byte *text1, byte *key)
{
byte c_temp1[64], c_temp2[32];
int  i_temp1, i_temp2;

  Des_TransPose(text1, Des_Table0, 64);
  memcpy(c_temp2, text1+32, 32);
  memcpy(text1+32, text1, 32);
  memcpy(text1, c_temp2, 32);
  Des_TransPose(key, Des_Table1, 56);
  for (i_temp1 = 0; i_temp1 < 16; i_temp1++)
  {
    memcpy(c_temp1 + 32, text1, 32);
    Des_Process(i_temp1, key, c_temp1 + 32, c_temp2, 'R');
    for (i_temp2 = 0; i_temp2 < 32; i_temp2++)
      if (text1[i_temp2 + 32] == c_temp2[i_temp2])
              c_temp1[i_temp2] = 0;
      else
              c_temp1[i_temp2] = 1;
    memcpy(text1, c_temp1, 64);
  }
  Des_TransPose(text1, Des_Table3, 64);
  return;
}

void Des_TransPose(byte *text, byte *table, int index)
{
byte c_temp1[64];
int  i_temp1;

  memcpy(c_temp1, text, 64);
  for (i_temp1 = 0; i_temp1 < index; i_temp1++)
    text[i_temp1] = c_temp1[table[i_temp1] - 1];
  return;
}

void Des_Process(int i, byte *key, byte *R32, byte *PB, byte flag)
{
byte extr32[48], extkey[56], c_temp1;
int  i_temp1;

  memcpy(extr32, R32, 32);
  Des_TransPose(extr32, Des_Table4, 48);

  if (toupper(flag) == 'L')
    Des_Lshift(key, Des_Table5[i]);
  else
    Des_Rshift(key, Des_Table6[i]);

  memcpy(extkey, key, 56);
  Des_TransPose(extkey, Des_Table2, 48);

  for (i_temp1 = 0; i_temp1 < 48; i_temp1++)
    if (extr32[i_temp1] == extkey[i_temp1])
      extr32[i_temp1] = 0;
    else
      extr32[i_temp1] = 1;

  for (i_temp1 = 0; i_temp1 < 8; i_temp1++)
  {
    c_temp1 = (byte)(extr32[i_temp1 * 6] * 32 +
             extr32[i_temp1 * 6 + 5] * 16 +
             extr32[i_temp1 * 6 + 1] *  8 +
             extr32[i_temp1 * 6 + 2] *  4 +
             extr32[i_temp1 * 6 + 3] *  2 +
             extr32[i_temp1 * 6 + 4]);
    c_temp1 = Des_Table8[i_temp1][c_temp1];
    if (c_temp1 >= 8)
    {
      PB[i_temp1 * 4] = 1;
      c_temp1 = (byte)(c_temp1 - 8);
    }
    else
      PB[i_temp1 * 4] = 0;
    if (c_temp1 >= 4)
    {
      PB[i_temp1 * 4 + 1] = 1;
      c_temp1 = (byte)(c_temp1 - 4);
    }
    else
      PB[i_temp1 * 4 + 1] = 0;
    if (c_temp1 >= 2)
    {
      PB[i_temp1 * 4 + 2] = 1;
      c_temp1 = (byte)(c_temp1 - 2);
    }
    else
      PB[i_temp1 * 4 + 2] = 0;
    if (c_temp1 >= 1)
      PB[i_temp1 * 4 + 3] = 1;
    else
      PB[i_temp1 * 4 + 3] = 0;
  }
  Des_TransPose(PB, Des_Table7, 32);
  return;
}

void Des_Lshift(byte *key, byte cnt)
{
byte c_temp1, c_temp2;
int  i_temp1,i_temp2;

  for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
  {
    c_temp1 = key[0];
    c_temp2 = key[28];
    for (i_temp1 = 0; i_temp1 < 55; i_temp1++)
      key[i_temp1] = key[i_temp1 + 1];
    key[27] = c_temp1;
    key[55] = c_temp2;
  }
  return;
}

void Des_Rshift(byte *key, byte cnt)
{
byte c_temp1, c_temp2;
int  i_temp1,i_temp2;

  for (i_temp2 = 0; i_temp2 < cnt; i_temp2++)
  {
    c_temp1 = key[27];
    c_temp2 = key[55];
    for (i_temp1 = 55; i_temp1 >0; i_temp1--)
      key[i_temp1] = key[i_temp1 - 1];
    key[0] = c_temp1;
    key[28] = c_temp2;
  }
  return;

#3


简单的,异或
#include <iostream> 
#include <stdio.h> 
#include <string.h> 

using namespace std; 

class encrypt 

public: 
encrypt(const char *); //构造函数,加密 
~encrypt(); 
void showcode(); 
void decrypt(); //解密 
private: 
char *code; 
int length; 
}; 

encrypt::encrypt(const char *string) 

int i=0; 
length=strlen(string);//获得原字符串的长度 
code=new char[length+1];// 加上结束符'\0' 
for(;i<length-1;i++) //从第一个字符开始,直到倒数第二个 

code[i]= string[i] ^ string[i+1]; //加密 

code[i]= string[i] ^ string[0];//i=length-1,最后一个字符 
//跟第一个字符做异或 

code[length] = '\0'; //加上结束符 



encrypt::~encrypt() 

delete[] code; 



void encrypt::showcode() 

for(int i=0;i<length;i++) 
printf("%1c",code[i]); //防止'\0',将字符逐个打出.不用iostream 
//iostream遇到'\0'会自动结束,,而加密过程中可能中间出现'\0',不该结束 


void encrypt::decrypt() 

char p; 
cout <<"\nThe First Character:"; 
cin >> p; 

code[length-1] ^= p; //最后一个字符跟第一个再次异或,得到原来的字符(两次异或,得到原值) 

for(int i=length-2; i>=0 ; i--) //从倒数第二个开始 

code[i]^=code[i+1]; //跟后面一个做异或,得原值 


cout<<"the original string is:" <<endl; 
showcode(); 
cout <<endl; 


int main() 

encrypt e("hello world!"); 
e.showcode(); 
e.decrypt(); 
return 0; 
}

#4


小弟刚学C++不久,还愿详细一点,现我的程序是窗口的形式,有个edt_password文本框,数据库中有个user表,表里有个password字段。
现我要将edt_password里的内容加密后放到password的字段中,然点再修改让password字段的内容显示到edt_password中,插入数据库是加密后的内容,读取出来要是解密后的内容,望兄弟给个这样的实际例子。

#5


直接把edt_password里的内容放到password的字段中你会不会?

#6


最简单的办法就是将各个位异或一下就可以了

#7


搞个函数就可以了,忘了是引用谁的了,不过可以用。
AnsiString encode(AnsiString *source)//异或加密,带钥匙加密,加密钥匙内部定义
{
  AnsiString astrEcode;
//用户专用密码,可以修改其中的5个密匙
  static const char i_userkey[5] = {0xab,0xbc,0xcb,0xde,0xef};
//开始加密/解密
  if(source->Length()>0)
   {
    for(int i=1; key=source->Length(); i<=key; i++)
      astrEcode = astrEcode + (char)(*source->substring(i,1).c_str() ^ (i+i_userkey[i%5));
  return astrEcode;
}
//解密的时候再调用这个函数就可以了。

#8


建议使用成熟的加密算法。