【密码学】LibOQS的再次尝试

admin 2024年12月30日15:11:48评论34 views字数 7338阅读24分27秒阅读模式

【密码学】LibOQS的再次尝试

【密码学】LibOQS的再次尝试

本篇文章,我们接着来看一下OQS这个库,这次呢,我们来看一下这个库,在其他语言当中的使用情况,最开始呢,我其实只想解决它在flutter当中的使用的问题,然后既然我的问题都解决了,就来捎带看一下,其他的语言是怎么用的吧[1]。

前置操作

这里,需要安装一些依赖,因为,首先要自己编译一下对应的库文件[2],这里跟着官方给出的文档操作就好了,这里没有太多的坑。这里,用的是mac, 并且安装了homebrew,对于其他系统,可以自行参考文档。

brew install cmake ninja openssl@3 wget doxygen graphviz astyle valgrindpip3 install pytest pytest-xdist pyyaml

然后,就是获取源码并且编译了。

git clone -b main https://github.com/open-quantum-safe/liboqs.gitcd liboqsmkdir build && cd buildcmake -GNinja -DBUILD_SHARED_LIBS=ON ..ninja

这里,需要稍等一会,取决于电脑的配置。

【密码学】LibOQS的再次尝试

然后编译完成之后,我们给安装一下,运行

sudo ninja install
【密码学】LibOQS的再次尝试

到这里,前置工作基本上就做完了,接下来,我们就分别来看一下,不同语言的使用。

Java Wrapper[3]

这里,因为这个库没有发到仓库,因此,我们需要自行安装和引入,首先来看一下编译过程,因为git上也没给成品,所以咱们自己动手了。

编译过程

首先,我们下载源码

git clone -b master https://github.com/open-quantum-safe/liboqs-java.git

这里,是需要用到maven的,相信用Java的读者,应该都有这个环境。

mvn package -P macosx -Dliboqs.include.dir="/usr/local/include" -Dliboqs.lib.dir="/usr/local/lib" -Dmaven.test.skip=true

注意,其他系统需要将-P后面的换成自己的系统,这里我们还是以Mac为例,稍等片刻。

【密码学】LibOQS的再次尝试

然后,我们会得到一个jar文件。

【密码学】LibOQS的再次尝试

使用样例

然后,接下来,我们就来看一下他的使用,首先,看一下官方的使用。

javac -cp target/liboqs-java.jar examples/KEMExample.javajava -cp target/liboqs-java.jar:examples/ KEMExample

不出意外,会得到一个错误,也就是找不到liboqs.7.dylib

【密码学】LibOQS的再次尝试

我尝试了下,文档说的方法

export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/lib"

发现并不好使,所以,干脆换个方案,我直接给移动进去。

cp /usr/local/lib/liboqs* [java path]Contents/Home/lib

然后在运行,这就没有问题了。

【密码学】LibOQS的再次尝试

可以发现,非常的nice,很成功。如果读者有其他更好

然后,我们试一下,如何给在一个项目当中使用,这里我们采用gradle,具体项目结构如下。

.├── build.gradle├── gradle│   └── wrapper│       ├── gradle-wrapper.jar│       └── gradle-wrapper.properties├── gradlew├── gradlew.bat├── libs│   └── liboqs-java.jar├── settings.gradle└── src    ├── main    │   ├── java    │   │   └── com    │   │       └── littleq    │   │           └── example    │   │               └── Main.java    │   └── resources    └── test        ├── java        └── resources14 directories, 8 files

这里,我们需要把liboqs-java.jar放到项目根目录的libs目录下,然后运行就可以了,代码,这里直接参考example里面的代码。

package com.littleq.example;import org.openquantumsafe.*;import java.util.ArrayList;import java.util.Arrays;publicclassMain{publicstaticvoidmain(String[] args){        System.out.println("Supported signatures:");        Common.print_list(Sigs.get_supported_sigs());        System.out.println();        System.out.println("Enabled signatures:");        Common.print_list(Sigs.get_enabled_sigs());        System.out.println();byte[] message = "This is the message to sign".getBytes();        String sig_name = "Dilithium2";        Signature signer = new Signature(sig_name);        signer.print_details();        System.out.println();long t = System.currentTimeMillis();byte[] signer_public_key = signer.generate_keypair();long timeElapsed = System.currentTimeMillis() - t;        System.out.println("Signer public key:");        System.out.println(Common.chop_hex(signer_public_key));        System.out.println("nIt took " + timeElapsed + " millisecs to generate the key pair.");        t = System.currentTimeMillis();byte[] signature = signer.sign(message);        System.out.println("It took " + (System.currentTimeMillis() - t) + " millisecs to sign the message.");        Signature verifier = new Signature(sig_name);        t = System.currentTimeMillis();boolean is_valid = verifier.verify(message, signature, signer_public_key);        System.out.println("It took " + (System.currentTimeMillis() - t) + " millisecs to verify the signature.");        System.out.println("nSignature:");        System.out.println(Common.chop_hex(signature));        System.out.println("nValid signature? " + is_valid);        signer.dispose_sig();        verifier.dispose_sig();    }}

可以发现,是运行成功的。

【密码学】LibOQS的再次尝试

C++ Wrapper[4]

接下来,我们来看一下,在c++当中,如何来使用,对于c++来说,其实要简单很多,虽然官方库好久没更新了,但是不影响使用。

使用样例

这里,不需要提前编译产物了,我们只需要直接拿下来源码就可以。

git clone https://github.com/open-quantum-safe/liboqs-cpp.git

这里,直接运行就可以了,因为,我们用的最新的oqs的库,因此,我们会得到一个警告。

【密码学】LibOQS的再次尝试

然后,这里,想要解决掉这个警告,直接修改一下就可以了。

【密码学】LibOQS的再次尝试

修改完成之后,可以发现,警告就没了。

【密码学】LibOQS的再次尝试

好了,有关于C++的集成,就讲到这里,对于C,因为源码就C写的,所以直接用就可以。

Python Wrapper[5]

对于Python,我们来看一下,首先需要建立一个Python的虚拟环境,记得不要装到系统的Python里面。

python3 -m venv venv. venv/bin/activatepython3 -m ensurepip --upgrade

编译安装

下载源码,直接安装就可以了。

git clone --depth=1 https://github.com/open-quantum-safe/liboqs-pythoncd liboqs-pythonpip install .
【密码学】LibOQS的再次尝试

运行样例

python3 examples/kem.py

可以发现,结果是成功的,但是还是和cpp一样,有版本警告的提示。

【密码学】LibOQS的再次尝试

Rust Wrapper[6]

对于Rust来说,那就很简单了,直接引入就可以了。

使用案例

首先,添加一下依赖。

[dependencies]oqs = {git = "https://github.com/open-quantum-safe/liboqs-rust.git"}

测试代码,还是用官方给提供的。

/// # Example: Some signed KEX/// This protocol has no replay protection!///use oqs::*;fnmain() -> Result<()> {let sigalg = sig::Sig::new(sig::Algorithm::Dilithium2)?;let kemalg = kem::Kem::new(kem::Algorithm::Kyber512)?;// A's long-term secretslet (a_sig_pk, a_sig_sk) = sigalg.keypair()?;// B's long-term secretslet (b_sig_pk, b_sig_sk) = sigalg.keypair()?;// assumption: A has (a_sig_sk, a_sig_pk, b_sig_pk)// assumption: B has (b_sig_sk, b_sig_pk, a_sig_pk)// A -> B: kem_pk, signaturelet (kem_pk, kem_sk) = kemalg.keypair()?;let signature = sigalg.sign(kem_pk.as_ref(), &a_sig_sk)?;// B -> A: kem_ct, signature    sigalg.verify(kem_pk.as_ref(), &signature, &a_sig_pk)?;let (kem_ct, b_kem_ss) = kemalg.encapsulate(&kem_pk)?;let signature = sigalg.sign(kem_ct.as_ref(), &b_sig_sk)?;// A verifies, decapsulates, now both have kem_ss    sigalg.verify(kem_ct.as_ref(), &signature, &b_sig_pk)?;let a_kem_ss = kemalg.decapsulate(&kem_sk, &kem_ct)?;assert_eq!(a_kem_ss, b_kem_ss);Ok(())}

最终,可以发现,非常的nice。

【密码学】LibOQS的再次尝试

好了,接下来,就开始,我实际遇到的问题了。

Flutter Wrapper

借助之前的知识,我们知道,flutter和rust是可以直接快速集成的[7], 具体集成方案以及需要安装的环境,这里我们就不赘述了,有兴趣的读者可以看一下我之前的文章,或者官方文档,然后我需要在flutter当中集成这个库,因为过程没有这么顺利,所以,才有了这篇文章,留给后续有需求的读者参考使用。

创建项目

这里,我们还是新建一个项目来做。

flutter_rust_bridge_codegen create my_app && cd my_app && flutter run

然后,添加对应的依赖

[package]name = "rust_lib_my_app"version = "0.1.0"edition = "2021"[lib]crate-type = ["cdylib", "staticlib"][dependencies]flutter_rust_bridge = "=2.6.0"oqs = {git = "https://github.com/open-quantum-safe/liboqs-rust.git"}

然后,我们简单写一个测试的代码,和之前的一样。

#[flutter_rust_bridge::frb(sync)]pubfnsign() -> Result<bool> {let sigalg = sig::Sig::new(sig::Algorithm::Dilithium2)?;let kemalg = kem::Kem::new(kem::Algorithm::Kyber512)?;// A's long-term secretslet (a_sig_pk, a_sig_sk) = sigalg.keypair()?;// B's long-term secretslet (b_sig_pk, b_sig_sk) = sigalg.keypair()?;// assumption: A has (a_sig_sk, a_sig_pk, b_sig_pk)// assumption: B has (b_sig_sk, b_sig_pk, a_sig_pk)// A -> B: kem_pk, signaturelet (kem_pk, kem_sk) = kemalg.keypair()?;let signature = sigalg.sign(kem_pk.as_ref(), &a_sig_sk)?;// B -> A: kem_ct, signature    sigalg.verify(kem_pk.as_ref(), &signature, &a_sig_pk)?;let (kem_ct, b_kem_ss) = kemalg.encapsulate(&kem_pk)?;let signature = sigalg.sign(kem_ct.as_ref(), &b_sig_sk)?;// A verifies, decapsulates, now both have kem_ss    sigalg.verify(kem_ct.as_ref(), &signature, &b_sig_pk)?;let a_kem_ss = kemalg.decapsulate(&kem_sk, &kem_ct)?;assert_eq!(a_kem_ss, b_kem_ss);Ok(true)}

然后,我们生成一下,对应的bindding代码。

flutter_rust_bridge_codegen generate

然后,添加对应的调用代码,因为我们设置的同步调用,因此直接放进来就可以了。

【密码学】LibOQS的再次尝试

然后,直接运行,不出意外,会出现报错。

【密码学】LibOQS的再次尝试

这看起来是没有吧openssl的相关库给加载进去,遇到问题,那肯定先搜一搜[8]。

【密码学】LibOQS的再次尝试

结果,肯定是有这样的问题的,看起来是,openssl的相关库,没有被正确处理进去,因为rust的openssl的binding直接搞得系统的openssl, 因此,这里需要手工把这个库加进去,熟悉macos开发的读者,应该就知道解决方案了,我们先手动加一下。

【密码学】LibOQS的再次尝试

这里,我们找到libcrypto.alibssl.a的路径给加进去。

【密码学】LibOQS的再次尝试

然后,保存后,再次运行,可以发现就可以运行成功的。

【密码学】LibOQS的再次尝试

但是,这么做会有一个新的问题,就是如果执行flutter clean之后,这个就没了,因此,我们不能每次都给这么加一下,比较麻烦,然后,这里看一下,他原来是如何加载依赖库的。

【密码学】LibOQS的再次尝试

然后,这里,我们直接配置下就好了。

【密码学】LibOQS的再次尝试

然后,清理掉缓存,再次构建,就可以发现,这个可以成功的被加载了。

总结

本文,其实我是为了解决在mac的flutter中使用oqs的问题,然后,捎带着看了下在其他语言下的使用,目前来看,这个库的更新还是比较勤快的,集成到其他语言也比较顺利,官方给了对应的代码,好了,快乐的时光过得特别快,又到了说再见的时候了,咱们下次再见。

参考资料

  1. https://openquantumsafe.org/liboqs/wrappers.html
  2. https://github.com/open-quantum-safe/liboqs
  3. https://github.com/open-quantum-safe/liboqs-java/tree/master
  4. https://github.com/open-quantum-safe/liboqs-cpp
  5. https://github.com/open-quantum-safe/liboqs-python
  6. https://github.com/open-quantum-safe/liboqs-rust
  7. https://cjycode.com/flutter_rust_bridge/
  8. https://github.com/fzyzcjy/flutter_rust_bridge/issues/1604

原文始发于微信公众号(Coder小Q):【密码学】LibOQS的再次尝试

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月30日15:11:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【密码学】LibOQS的再次尝试https://cn-sec.com/archives/3569908.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息