Java与C++通过DES、blowfish互相加解密

  提问: 7 年 前 最后更新: 6 年 前 浏览数: 14202

在简单的服务器端与客户端通信的应用中,这种做法比较常见

DES、blowfish扫盲:

1.des的常见模式分为四种 ECB / CBC / CFB / OFB     这里使用默认的ECB

ECB的缺陷:能从密文看出明文的规律

加 密算法是按块进行加密的, DES ,是 64Bit 一个块的进行加密,就是每次加密 8 个字节,因此每次输入八个字节的明文输出八个字节密文,如果是 16 个字节,那么分成两个块依次进行加密,问题就出现在这里,如果明文是 1234567812345678,分块分别进行加密,那么加密的结果类似“C4132737962C519C C4132737962C519C”,可以看出明文的规律,这就是 ECB 加密模式,密文可以看出明文的规律

CBC/CFB/OFB:

为 了解决这个问题,有了其他的加密模式:CBC 加密模式(密码分组连接),CFB加密模式(密码反馈模式),OFB加密模式(输出反馈模式)CBC 是要求给一个初始化的向量,然后将每个输出与该向量作运算,并将运算的结果作为下一个加密块的初始化向量,CFB 和 OFB 则不需要提供初始化向量,直接将密码或者输出作为初始化向量进行运算;这样就避免了明文的规律出现在密文中;当然缺点是解密时需要保证密文的正确性,如果 网络传输时发生了一部分错误,则后面的解密结果就可能是错误的;(ECB模式仅影响传输错误的那个块);

2.上面提到des是以64bit作为单位块单位来进行加密的,如果加密的内容长度刚好不是64bit块的倍数,则需要做填充(padding)

常 用的填充算法是 PKCS#7,该填充方法是将每一个补充的字节内容填充为填充的字节个数;例如明文长度是 100 , 分组的大小是32个字节,那么需要分为四组,补充28个字节,那么补充的字节全部补充为'\0x28',如果分组的大小是 8 个字节,那么 PKCS#7 的填充方式和 PKCS#5 是完全一致的;另外还有一个规定,就是如果明文刚刚好进行分组,那么需要补充一个独立的分组出来,例如 DES ,如果明文为 8 个字节,那么需要补充为 16 个字节进行运算,这样的好处是进行解密后,将解密出来的最后一个字节取出来,并将解密结果的长度减去该值,就是原来明文的长度;

当然你也可以选择NoPadding模式,自己对加密内容的字节数做处理,确保它的长度是64bit的倍数

(以上规则blowfish也同样使用)

代码:

java

import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;

public class DESPlus
{
 static String strDefaultKey = "initkey";
 static Cipher encryptCipher = null;
 static Cipher decryptCipher = null;
 
 static {
     Security.addProvider(new com.sun.crypto.provider.SunJCE());
     Key key = null;
    try {
      key = getKey(strDefaultKey.getBytes());
      encryptCipher = Cipher.getInstance("DES");
      encryptCipher.init(Cipher.ENCRYPT_MODE, key);

      decryptCipher = Cipher.getInstance("DES");
      decryptCipher.init(Cipher.DECRYPT_MODE, key);
    }catch(Exception e){
        e.printStackTrace();
        }
    }

 public DESPlus(){
 }

 public static byte[] encrypt(byte[] arrB) throws Exception {
  return encryptCipher.doFinal(arrB);
 }

 public static byte[] decrypt(byte[] arrB) throws Exception {
  return decryptCipher.doFinal(arrB);
 }

 private static  Key getKey(byte[] arrBTmp) throws Exception {
  byte[] arrB = new byte[8];
  for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
   arrB[i] = arrBTmp[i];
  }
  Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
  return key;
 }
 
}
c++
int Encrypt( unsigned char * inbuf , unsigned char * * outbuf , int inlen , unsigned char * key, unsigned char * iv )
{
    BIO *bio, *mbio, *cbio;
    unsigned char *dst;
    int outlen;

    mbio = BIO_new( BIO_s_mem( ) );
    cbio = BIO_new( BIO_f_cipher( ) );
    BIO_set_cipher( cbio , EVP_des_ecb( ) , key , iv , 1 );

    bio = BIO_push( cbio , mbio );
    BIO_write( bio , inbuf , inlen );
    BIO_flush( bio );

    outlen = BIO_get_mem_data( mbio , (unsigned char **) & dst );
    * outbuf = ( unsigned char * ) malloc( outlen );
    memcpy( * outbuf , dst , outlen );
    BIO_free_all( bio );

    return outlen;
}

附上C++的openssl库

http://115.com/file/clfbpkt2

提问时间 2011-11-05 22:19

openkk的头像

openkk
56 3 1
答案被采用率: 0.0%


回答于 2011-11-05 23:11

Eileen的头像

Eileen
0 0 2
答案被采用率: 0.0%

帮公司长期招聘以下职位,有意者可将简历Email至:lcassie@163.com.

JAVA工程师
要求:    
1.一年以上JAVA开发经验,熟悉软件开发流程;
2.精通JAVA语言,精通Struts、Hibernate、和Hibernate3.0开发;
3.熟练掌握SQL语法,精通Oracle等主流数据库相关技术及工具;
4.熟悉WebLogic/Tomcat等主流J2EE应用服务器,熟悉linux等服务器的配置
5.具备一定的系统设计能力需求分析能力,能完成相关技术文档编写;
6.具备较好的沟通协调能力、工作认真,能承受一定工作压力,有较强团队意识。

高级JAVA工程师
要求    
1.计算机或相关专业本科学历,重点大学本科以上学历优先,2年以上工作经验,1年以上J2EE应用开发经验;
2.至少参加过一个以上的大型软件项目的设计和开发;
3.深刻理解计算机原理,擅长进行模块设计、接口设计、代码开发;
4.精通面向对象设计方法和设计模式,逻辑能力佳,熟悉Rational Rose、UML设计工具;
5.理解J2EE系统架构,具有大型基于J2EE体系结构的设计和开发经验;
6.精通jQuery/spring/iBATIS应用框架;
7.熟悉eclipse开发工具及插件配置;
8.熟练掌握Oracle/mysql主流数据库应用,有一定的数据库设计经验;
9.熟悉WEB SERVICE开发;
10.熟悉tomcat、weblogic软件。


Java普通开发工程师
要求    
1.2年以上JAVA开发经验;
2.熟悉EXTJS、spring MVC、iBatis开发技术;
3.熟练使用spring+structs+hibernate等框架开发;
4.熟练tomcat服务器配置和使用.

Java高级开发工程师
要求    
1.有丰富的JAVA开发经验;
2.能独立完成复杂逻辑关系数据库的设计与开发;
3.熟悉EXTJS、spring MVC、iBatis开发技术;
4.熟练使用spring+structs+hibernate等框架开发;
5.熟练tomcat服务器配置和使用.

java架构师
要求    
1.至少有1-2个大型系统架构设计经验,有异构系统集成经验尤佳;
2.精通JAVA编程,熟悉J2EE、SCA等技术规范;
3.精通Struts、Spings、Hibernate、ExtJS等;
4.抽象思维能力强,能熟练使用Rational Rose/PowerDesigner进行系统分析、设计;
5.表达能力强,能完整、准确阐述架构设计方案,并指导软件工程师开展工作;
6.熟悉WebLogic、WebSphere、JBoss/Tomcat等中间件;
7.熟悉Oracle、MSSQL、DB2等数据库。

Net Programmers .Net程序员
要求    
1.精通.NET编程技术,熟悉html、javascript,对JS技术有一定的研究;
2.大于1年以上.NET网站项目开发经验,有成功的开发案例;
3.精通sql server,及其性能优化,能独立设计高负荷的数据结构;
4.具备系统分析和设计能力,以及规范化、标准化的代码编写习惯;
5.有大型系统开发及设计经验、对SEO有一定的了解的优先考虑

C++软件工程师
要求    
1.熟悉C/C++;
2.对WIN32 API及界面开发有比较深的认识和应用经验;
3.熟悉TCP/IP socket通信;
4.对常用Windows控件的基本消息要有了解。

高级C/C++工程师
要求    
1.计算机或相关专业本科及其以上学历,三年以上C/C++/VC++/Linux C开发经验;
2.两年以上Socket编程,对Internet通讯有较深入的了解,熟悉IOCP和多线程处理;
3.熟悉P2P原理,熟悉KAD协议原理;
4.熟悉网络视频传输协议、视频文件格式,有从事过流媒体相关项目经验优先;
5.有良好的设计思路和编程习惯,熟悉软件开发流程,能够根据产品需求完成技术概要设计和详细设计;
6.独立开发和自我约束能力强、善于和他人沟通、工作认真负责、能够承受工作压力、具有团队合作精神;
7.英语良好,能流畅阅读计算机英语专业文献;

质量工程师
要求
1.计算机或通信相关专业毕业,本科以上学历,对软件过程规范、软件质量有较深理解;
2.有较强的识别问题能力;
3.具有创新思维,思维敏捷,热爱流程创新工作;
4.具备较强的沟通、组织协调能力,工作积极主动,有较强的学习能力。

回答于 2012-03-08 16:26

lcassie的头像

lcassie
0 0 7
答案被采用率: 0.0%

您的回答:

  

powered by Open-Open.com