IKVM.net调用Jar包实现SM4解密

近期,我深入学习了如何使用IKVM.net来调用Jar包,这次的学习经历让我对Java与.NET之间的互操作性有了更深刻的理解。IKVM.net作为一款强大的工具,为我们打通了Java与.NET之间的桥梁,使得在.NET环境中调用Java库变得简单而高效。

在学习过程中,我首先了解了IKVM.net的基本原理和架构。它通过将Java字节码转换为.NET的CIL(Common Intermediate Language)字节码,使得Java库可以在.NET环境中运行。这种转换过程保留了Java库原有的功能和性能,同时也充分利用了.NET平台的优势。

接下来,我尝试使用IKVM.net来调用一个具体的Jar包。在这个过程中,我遇到了一些挑战,比如如何正确配置IKVM.net的环境、如何导入Java库以及如何处理Java与.NET之间的类型映射等问题。通过查阅文档和搜索相关资料,我逐渐解决了这些问题,并成功实现了Jar包的调用。

在调用Jar包的过程中,我深刻体会到了IKVM.net的灵活性和强大性。它允许我们在.NET代码中直接使用Java库中的类和方法,就像使用普通的.NET库一样。这种无缝的集成方式极大地提高了开发效率,也降低了维护成本。

然而,我也发现了一些IKVM.net在使用上的限制和不足之处。比如,一些复杂的Java库可能无法完全转换为.NET代码,导致某些功能无法使用。此外,由于Java和.NET在内存管理和垃圾回收机制上存在差异,因此在使用IKVM.net时需要特别注意内存泄漏和性能优化等问题。

针对这些问题,我认为在使用IKVM.net时应该采取一些策略来规避风险。首先,我们应该尽量选择那些已经经过验证和优化的Java库进行调用,以避免潜在的问题。其次,在调用Java库时,我们应该注意内存使用和性能监控,及时发现并解决潜在的问题。最后,我们还可以考虑使用其他跨平台解决方案或混合编程技术来替代IKVM.net,以满足特定的需求。

通过这次学习,我不仅掌握了IKVM.net的使用方法,还学会了如何分析和解决在调用Jar包过程中遇到的问题。我相信这些经验和技能将在未来的开发工作中发挥重要作用,帮助我更好地应对各种挑战和需求。

总之,IKVM.net是一个强大的工具,它为我们打通了Java与.NET之间的桥梁。虽然在使用过程中可能会遇到一些问题,但只要我们掌握了正确的方法和策略,就能够充分利用它的优势,实现Java与.NET之间的无缝集成。

以上是AI写的部分。。。用来水字数

下面是实际操作。由于需要对java程序SM4加密的字段进行解密,试过通过C#代码实现SM4解密,但是即使代码流程相同,但是可能是Java和C#底层差异的原因导致始终无法解密,所以采用了IKVM方案直接调用jar包进行解密。

.net core项目调用jar包

环境

Netcore版本:.netCore5.0

Ikvm版本:8.5.0

JavaSDK版本:jdk1.8

JavaIDE:Idea2024

C#IDE:VS2022

NuGet下载IKVM包

项目放入jar包

编辑项目文件

添加以下配置项

XML 复制代码
<ItemGroup>

<IkvmReference Include="jar/xxxx.jar">

<AssemblyName>xxxx</AssemblyName>

<AssemblyVersion>x.x.x</AssemblyVersion>

</IkvmReference>

</ItemGroup>

测试jar包

cs 复制代码
using log4net;

using System;

using System.Text;


namespace TestService

{
    class Program
    {
        private static ILog log = LogManager.GetLogger(typeof(Program));

        /**
         * 默认 SECRET_KEY
         * 当时用ECB模式的时候,和前端key一致
         * secretKey 必须为16位,可包含字母、数字、标点
         */
        private static String SECRET_KEY = "1234123412341234";

        /**
         * 默认 IV
         * 当时用CBC模式的时候,SECRET_KEY和IV都需要传值,解密要和加密的SECRET_KEY和IV一致,更加安全
         * iv 必须为 16 位,可包含字母、数字、标点
         */
        private static String IV = "1234123412341234";
        static void Main(string[] args)
        {
            string value = SM4Utils.decryptData_CBC("xxxxxx", SECRET_KEY, IV);
            byte[] arr = Convert.FromBase64String(value);
            string value2 = Encoding.UTF8.GetString(arr);
            Console.WriteLine(value);
            Console.WriteLine(value2);
            Console.ReadLine();
        }
    }
}

.net framework调用jar包

环境

NetFramework版本:.net framework4.6.1

Ikvm版本:8.1.5717

JavaSDK版本:jdk1.8

JavaIDE:Idea2024

C#IDE:VS2022

下载IKVM运行包

下载IKVM的运行包,由于我是jdk1.8,所以需要是IKVM8才行。所以下载了IKVM8.1.5717版本

生成jar包(如果有直接可以使用的jar包可以跳过这步)

新建项目

输入项目名,选择maven

在pom文件中加入要导入的工具jar包,为了简化后面的dll生成步骤,最好只给必要的jar,不然生成dll的时候可能会出现缺少关联的情况

编写好程序后,选择项目属性

选择Artifacts

选择根据导出生成jar包

创建artifacts

然后在指定的位置可以看到生成的jar包和关联的jar包

将jar包转换为dll文件

打开cmd,进入ikvm的bin目录,例如(ikvm-8.1.5717.0\bin)

将jar包移入bin目录(此操作只是为了方便执行命令)

执行命令ikvmc -target:library xxx-x.x.x.jar

如果该jar有关联的jar包,则需要将关联包转为dll文件,然后转换目标jar包时关联jar对应的dll包,命令如下

ikvmc -target:library xxx-x.x.x.jar -r:xxxx.dll -r:xxx1.dll

程序NuGet下载IKVM包

根据之前转换的IKVM版本下载对应的NuGet包

将dll文件导入程序

添加dll引用,相关的dll都需要引用

然后就可以测试jar里面的方法是否可以调用了

相关推荐
公贵买其鹿14 分钟前
List深拷贝后,数据还是被串改
java
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp6 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea