使用Sign64.dll对海关申报数据加签

  • 官方文档
    • 第一章控件使用说明
    • 第二章接口说明
      • 基本操作
        • 1. 取卡号
        • 2. 取证书号
        • 3. 加签
          • 返回值说明
    • 我自己的使用过程
      • JNA代码
      • 然后就是我的测试代码
      • Maven
      • 参考链接
    • 写在最后

链接:https://pan.baidu.com/s/1zNa42LDPdDHLJceNodZVQw
提取码:cmm5

官方文档

第一章控件使用说明

本控件以dll的方式提供,调用时需链接Sign64.dll。本控件适应于64位操作系统。

第二章接口说明

请注意以下事项:
(1)[in,out]类型的参数既为输入参数也为输出参数,在使用时必须给定参数的初始值,空间会根据该值判断调用者开辟的空间是否够大
(2)字符统一采用BYTE类型,即unsigned char,长度为UINT,即unsigned int,输出的字节流建议根据长度来取
(3)指针与缓冲区由外部调用程序做初始化

基本操作

1. 取卡号

项目 说明
函数原型 UINT GetCardID(BYTE* szCardID, UINT* nCardIDLen)
使用前提 extern “C” _declspec(dllimport) UINT GetCardID(BYTE* szCardID, UINT* nCardIDLen)
功能简介 取卡号,卡号至少分配100字节
参数说明 【out】szCardID 卡号,以\0结束
【in,out】nCardIDLen 卡号长度(该参数输入时不能等于0,必须是szCardID实际开辟的空间大小)

返回值说明

返回值 说明
0 取卡号成功
-1 卡初始化错
-2 取卡号失败

2. 取证书号

项目 说明
函数原型 UINT GetCertNo(BYTE* szCertNo, UINT* nCertNoLen)
使用前提 extern “C” _declspec(dllimport) UINT GetCertNo(BYTE* szCertNo, UINT* nCertNoLen)
功能简介 取证书号,证书号至少分配100字节
参数说明 【out】szCertNo 证书号,以\0结束
【in,out】nCertNoLen 证书号长度(该参数输入时不能等于0,必须是szCertNo实际开辟的空间大小)

返回值说明

返回值 说明
0 取证书号成功
-1 卡初始化错
-2 取证书号失败

3. 加签

项目 说明
函数原型 UINT Sign(BYTE *src, UINT srcLen, BYTE *sign, UINT signLen, const char * pwd)
使用前提 extern “C” _declspec(dllimport) UINT Sign(BYTE *src, UINT srcLen, BYTE sign, UINT signLen, const char * pwd)
功能简介 用加密设备传入报文进行加签
参数说明 【in】src 待签名的原始数据
【in】srcLen 待签名的原始数据的长度
【out】sign 签名数据,至少分配128字节
【in,out】signLen 签名数据长度,应大于128个字节,输入时应等于szSignData实际分配的空间大小
【in】pwd 进行加签的卡密码
返回值说明
返回值 说明
0 签名成功
-1 卡初始化错
-2 卡口令不正确
-3 签名失败
-4 PEM编码失败

我自己的使用过程

因为我整个web程序使用的是JAVA进行开发,而官方提供的文件是DLL,那么也就意味着我需要用Java去调用DLL,听说过可以使用JNI来调用,但是看了网上的教程,都太复杂了,不太适合我这种只有很短时间用来开发的,后来又发现了一个JNI的框架,名字叫JNA,网上JNA的教程很多,我就不赘述如何使用,主要是记录下我在C++指针踩的坑。

JNA代码

因为一开始没有太理解C++中的指针,所以BYTE*我尝试过很多类型,包括char[] 、String 、byte[],结果都不行,后来使用Memory 来分配一段连续的地址,就类似C语言中的malloc函数。

这个问题倒是解决了,还有个问题是UINT*类型,我一开始想,直接给个int,应该也没啥问题,后来发现,不得行,还是的使用int指针,JNA提供了IntByReference 类表示Int指针,同时JNA还提供了很多常用的指针类型,大概是在com.sun.jna.ptr包中,有需要的可以看看。

好了,问题解决了,那么我附上代码

import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;public interface CLibrary extends Library {CLibrary INSTANCE = Native.loadLibrary("Sign64", CLibrary.class);/*** 取卡号<br>* UINT GetCardID(BYTE* szCardID, UINT* nCardIDLen)* * @param szCardID*            卡号,以\0结束* @param nCardIDLen*            卡号长度(该参数输入时不能等于0,必须是szCardID实际开辟的空间大小)* @return 0 取卡号成功 -1 卡初始化错 -2 取卡号失败* */int GetCardID(Memory szCardID, IntByReference nCardIDLen);/*** 取证书号 <br>* UINT GetCertNo(BYTE* szCertNo, UINT* nCertNoLen)* * @param szCertNo*            证书号,以\0结束* @param nCardIDLen*            证书号长度(该参数输入时不能等于0,必须是szCertNo实际开辟的空间大小)* @return 0 取证书号成功 -1 卡初始化错 -2 取证书号失败* */int GetCertNo(Memory szCertNo, IntByReference nCardIDLen);/**签名* UINT Sign(BYTE *src, UINT srcLen, BYTE *sign, UINT* signLen, const* char * pwd)* * @param src*            待签名的原始数据* @param srcLen*            待签名的原始数据的长度* @param sign*            签名数据,至少分配128字节* @param signLen*            签名数据长度,应大于128个字节,输入时应等于szSignData实际分配的空间大小* @param pwd*            进行加签的卡密码* @return 0 签名成功 -1 卡初始化错 -2 卡口令不正确 -3 签名失败 -4 PEM编码失败* */int Sign(String src, int srcLen, Memory sign, IntByReference signLen, String pwd);}

然后就是我的测试代码

 public static void main(String[] args) {Memory memory = new Memory(100);IntByReference intby = new IntByReference(100);System.out.println("**********************取卡号**********************");int getCardID = CLibrary.INSTANCE.GetCardID(memory, intby);System.out.println(getCardID);System.out.println(intby.getValue());System.out.println(new String(memory.getByteArray(0, intby.getValue())));Memory memory1 = new Memory(100);System.out.println("**********************取证书号**********************");int getCertNo = CLibrary.INSTANCE.GetCertNo(memory1, intby);System.out.println("获取状态:" + getCertNo);System.out.println(intby.getValue());System.out.println("证书号:" + new String(memory1.getByteArray(0, intby.getValue())));Memory sign = new Memory(100);IntByReference intbyReference = new IntByReference(100);String src = "testsssssss";System.out.println("**********************数据加签**********************");int sign2 = CLibrary.INSTANCE.Sign(src, src.length(), sign, intbyReference, "12345678");System.out.println(sign2);System.out.println(new String(sign.getByteArray(0, intbyReference.getValue())));}

Maven

 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna-platform</artifactId><version>4.5.0</version></dependency>

参考链接

  • https://blog.csdn.net/ybhjx/article/details/70495720
  • https://blog.csdn.net/xinxinlong/article/details/6293289
  • https://blog.csdn.net/xiaozhendong123/article/details/50039143

写在最后

如果你跟我一样,如果是在对海关申报数据进行加签的话,那么请一定要将海关总署提供的usercard_cert64文件夹下的所有文件放到合适的位置,不然会产生错误。我一开始也是以为只需要Sign64.dll文件,其实不然,都需要。大概文件目录如下

├─paascloud-master
│ │CPUCard_Client64.dll
│ │epEportBasicApp64.dll
│ │EportSMWConfig.xml -----------------------这个xml文件也有用
│ │IKeyAPI.dll
│ │Sign64.dll
│ │SimpleICAPI.dll
│ │SPSecureAPI64.dll
│ │USBCrw.dll
│ │
│ │

Java调用DLL对海关申报数据加签相关推荐

  1. 调用电子口岸IC卡/UKEY控件WebSocket方式进行数据加签的示例

    本示例通过一个纯html+js的页面文件,演示了以WebSocket方式调用电子口岸IC卡/UKEY控件,对数据进行加签 应用场景包括:海关业务报文申报.海关总署2018年179号公告对接加签要求等 ...

  2. java dll 调用方法_关于Java调用dll的方法 | 学步园

    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C   写好的DLL库时,由于基本数据类型不同.使用字节 ...

  3. 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。

    关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...

  4. Java 调用Dll

    Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样. 这个程序是java中调用dll中的求和函数. 一,java代码部分操作 1.新建pr ...

  5. 关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat

    关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat 参考文章: (1)关于j ...

  6. java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定 | 学步园

    终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖 ...

  7. java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定

    终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖 ...

  8. java 多线程 调用 dll 出错,JAVA调用DLL异常,请高手寻找异常原因,给出解决方法...

    当前位置:我的异常网» J2SE » JAVA调用DLL异常,请高手寻找异常原因,给出解决方法 JAVA调用DLL异常,请高手寻找异常原因,给出解决方法 www.myexceptions.net  网 ...

  9. java调用ocx控件获取数据_Java调用ocx控件以及dll

    通过Java调用OCX控件有几种方法,JNI.JACOB.Jawin等 1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐. 2.Jawin 尝试了一下,效果不错,但相对来说, ...

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(20)-权限管理系统-根据权限获取菜单
  2. mysql 字符列做日期分区_mysql 根据日期字段做表分区
  3. 基于JFinal框架开发的企业办公系统-JFinalOA v1.1源码
  4. matlab 读取视频出现的问题
  5. 你好,未来! | 2018腾讯“云+未来”峰会五月启幕
  6. python统计数据库中每个数的个数,如何统计每个数据库中每个集合中的文档数?...
  7. 【ArcGIS|空间分析】地形特征相关计算
  8. 如何在基于对话框的程序中动态设置鼠标指针
  9. MongoBD命令大全
  10. 阿里云 IOT 物联网平台简单使用【随笔】
  11. 苹果造车简史:库克能靠造车封神吗?
  12. Java问题——can not be represented as java.sql.Date 错误解决
  13. [golang gin框架] 27.Gin 商城项目-购物车
  14. W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。GPG 错误:http://mirrors.ustc.edu.cn/kali kali-rolling
  15. 数据库作业:关系数据库及相关概念
  16. 【CSS】固定区域竖向滚动
  17. 【练习四 数组(强化) 编程题 9. 阿迪看医生 】
  18. 字号磅、像素、厘米转换
  19. 批量识别医疗票据【第1版】
  20. 模糊PID(重心法解模糊梯形图FC)

热门文章

  1. 虚幻4html5游戏,开发者:虚幻5使游戏文件大小飞涨 呈现独特挑战
  2. ROS入门与实践--1(ROS简介与ROS的安装)
  3. springboot+mybatisplus+达梦数据库
  4. [ZZULIOJ] 2923:你玩过糖豆人吗
  5. 巨磁阻抗GMI磁传感器模组选型推荐
  6. 嵌入式DSP上实现FlexRay总线的方法
  7. Linux(Ubuntu)使用setsid命令后台运行python代码并记录终端输出,并实现开机自启
  8. 仿android微信视频编辑,Android 仿微信短视频录制
  9. 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染
  10. Java基础(9)——final、权限、内部类、引用类型