| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx

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

1
Java C/C++ Go 16560 次浏览

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

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

3个答案

0

It was created with extensive help from our friends, the Sun Microsystems engineers. Jon Jagger wrote one of the first computer programs. You can read more to know more about this language and learn new things.

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.具备较强的沟通、组织协调能力,工作积极主动,有较强的学习能力。
0