user-0 提问: 求一个解决思路：加密和解密分别用了一个秘钥后保存压缩

回复:
user: user-1
content: 仅将文件名或链接保存到数据库中。

user: user-2
content: 压缩可以减短文本的长度，但是对于加密过后的内容来说，压缩比应该不高。  信息总是要占内存的，这跟有没有加密，有没有压缩，没有关系。

user: user-0
content: 引用 2 楼 chehw_1 的回复:如果所需加密的明文过长，那么不要直接用非对称加密的方法直接加密，否则会严重影响性能。  可以考虑用非对称加密算法（RSA、ECC等）的公钥来加密一个对称式加密（比如AES_CBC_256）密钥K，并用密钥K通过对称加密算法进行加密； 解密时，先用私钥解密来获取密钥K，然后再用对应的对称加密算法进行解密。 恩，只用它来存续用户信息应该没有问题

user: user-0
content: 引用 1 楼 yuelengdihai 的回复:[/code]有没有长度限制

user: user-3
content: 如果所需加密的明文过长，那么不要直接用非对称加密的方法直接加密，否则会严重影响性能。  可以考虑用非对称加密算法（RSA、ECC等）的公钥来加密一个对称式加密（比如AES_CBC_256）密钥K，并用密钥K通过对称加密算法进行加密； 解密时，先用私钥解密来获取密钥K，然后再用对应的对称加密算法进行解密。

user: user-4
content: 仅供参考 #include <iostream.h> #include <math.h> #include <stdio.h>  typedef int Elemtype; Elemtype p,q,e; Elemtype fn; Elemtype m,c; int flag = 0; typedef void (*Msghandler) (void); struct MsgMap {  char ch;  Msghandler handler; }; /* 公钥 */ struct PU {  Elemtype e;  Elemtype n; } pu; /* 私钥 */ struct PR {  Elemtype d;  Elemtype n; } pr; /* 判定一个数是否为素数 */ bool test_prime(Elemtype m) {  if (m <= 1) {   return false;  }  else if (m == 2) {   return true;  }  else {   for(int i=2; i<=sqrt(m); i++) {    if((m % i) == 0) {     return false;     break;    }   }   return true;  } } /* 将十进制数据转化为二进制数组 */ void switch_to_bit(Elemtype b, Elemtype bin[32]) {  int n = 0;  while( b > 0) {   bin[n] = b % 2;   n++;   b /= 2;  }  } /* 候选菜单，主界面 */ void Init() {  cout<<"*********************************************"<<endl;  cout<<"***       Welcome to use RSA encoder      ***"<<endl;  cout<<"***               a.about                 ***"<<endl;  cout<<"***               e.encrypt               ***"<<endl;  cout<<"***               d.decrypt               ***"<<endl;  cout<<"***               s.setkey                ***"<<endl;  cout<<"***               q.quit                  ***"<<endl;  cout<<"**********************************by*Terry***"<<endl;  cout<<"press a key:"<<endl; } /* 将两个数排序，大的在前面*/ void order(Elemtype &in1, Elemtype &in2) {  Elemtype a = ( in1 > in2 ? in1 : in2);  Elemtype b = ( in1 < in2 ? in1 : in2);  in1 = a;  in2 = b; } /* 求最大公约数 */ Elemtype gcd(Elemtype a, Elemtype b) {  order(a,b);  int r;  if(b == 0) {  return a;  }  else {   while(true) {    r = a % b;    a = b;    b = r;    if (b == 0) {    return a;    break;    }   }  }  } /* 用扩展的欧几里得算法求乘法逆元 */ Elemtype extend_euclid(Elemtype m, Elemtype bin) {  order(m,bin);  Elemtype a[3],b[3],t[3];  a[0] = 1, a[1] = 0, a[2] = m;  b[0] = 0, b[1] = 1, b[2] = bin;  if (b[2] == 0) {    return a[2] = gcd(m, bin);   }  if (b[2] ==1) {    return b[2] = gcd(m, bin);  }  while(true) {   if (b[2] ==1) {    return b[1];    break;   }   int q = a[2] / b[2];   for(int i=0; i<3; i++) {    t[i] = a[i] - q * b[i];    a[i] = b[i];    b[i] = t[i];   }  } } /* 快速模幂算法 */ Elemtype modular_multiplication(Elemtype a, Elemtype b, Elemtype n) {  Elemtype f = 1;  Elemtype bin[32];  switch_to_bit(b,bin);  for(int i=31; i>=0; i--) {   f = (f * f) % n;   if(bin[i] == 1) {    f = (f * a) % n;   }  }  return f; } /* 产生密钥 */ void produce_key() {  cout<<"input two primes p and q:";  cin>>p>>q;    while (!(test_prime(p)&&test_prime(q))){   cout<<"wrong input,please make sure two number are both primes!"<<endl;   cout<<"input two primes p and q:";   cin>>p>>q;  };  pr.n = p * q;  pu.n = p * q;  fn = (p - 1) * (q - 1);  cout<<"fn = "<<fn<<endl;  cout<<"input e :";  cin>>e;  while((gcd(fn,e)!=1)) {   cout<<"e is error,try again!";   cout<<"input e :";   cin>>e;  }  pr.d = (extend_euclid(fn,e) + fn) % fn;  pu.e = e;  flag = 1;  cout<<"PR.d: "<<pr.d<<"   PR.n: "<<pr.n<<endl;  cout<<"PU.e: "<<pu.e<<"   PU.n: "<<pu.n<<endl; } /* 加密 */ void encrypt() {  if(flag == 0) {   cout<<"setkey first:"<<endl;   produce_key();  }  cout<<"input m:";  cin>>m;  c = modular_multiplication(m,pu.e,pu.n);  cout<<"c is:"<<c<<endl; } /* 解密 */ void decrypt() {  if(flag == 0) {   cout<<"setkey first:"<<endl;   produce_key();  }  cout<<"input c:";  cin>>c;  m = modular_multiplication(c,pr.d,pr.n);  cout<<"m is:"<<m<<endl; } /* 版权信息 */ void about() {  cout<<"*********************************************"<<endl;  cout<<"***               by Terry                ***"<<endl;  cout<<"*** copyright 2010,All rights reserved by ***"<<endl;  cout<<"*** Terry,technology supported by weizuo !***"<<endl;  cout<<"*** If you have any question, please mail ***"<<endl;  cout<<"*** to 18679376@qq.com   !                ***"<<endl;  cout<<"*** Computer of science and engineering   ***"<<endl;  cout<<"*** XiDian University    2010-4-29        ***"<<endl;  cout<<"*********************************************"<<endl;  cout<<endl<<endl;  Init(); } /* 消息映射 */ MsgMap Messagemap[] = {  ,  ,  ,  ,   }; /* 主函数，提供循环 */ void main() {  Init();  char d;  while((d = getchar())!='q') {   int i = 0;   while(Messagemap[i].ch) {    if(Messagemap[i].ch == d) {     Messagemap[i].handler();     break;    }    i++;   }  } }