已解决
背景
各位大拿,我是Rust自学小白,我将一些java项目翻译成Rust进行学习,发现用到了AES加密、解密算法。Rust的加解密算法发展很快,目前还未找到Rust实现方法。比如Ring库或者Cripto库,我都没看到具体的AES128 加解密方案,网上的样例都是老版本的,最新版本都没找大。Ring v0.17.8有哪位大拿帮我看看这个。
非常感谢。
Java采用的算法是AES128 SHA1PRNG
1
共 6 条评论, 1 页
评论区
写评论解决了
昨晚上折腾到9点,调通了,今天又重新重构了一下。为了方便理解,合并了几个方法。 各位大神一眼就看出来代码的问题,给你们点赞!多谢引导我这个小白进一步前进。这个AES折腾几天了。哈哈哈哈,Rust ring的这个封装的真实没那么方便。以下是通过版本
aes-gcm 算法的,直接用这个库吧 https://docs.rs/aes-gcm/latest/aes_gcm/
示例如下: use aes_gcm::{ aead::{Aead, AeadCore, KeyInit, OsRng}, Aes256Gcm, Nonce, Key // Or
Aes128Gcm
};// The encryption key can be generated randomly: let key = Aes256Gcm::generate_key(OsRng);
// Transformed from a byte array: let key: &[u8; 32] = &[42; 32]; let key: &Key = key.into();
// Note that you can get byte array from slice using the
TryInto
trait: let key: &[u8] = &[42; 32]; let key: [u8; 32] = key.try_into()?;// Alternatively, the key can be transformed directly from a byte slice // (panicks on length mismatch): let key = Key::::from_slice(key);
let cipher = Aes256Gcm::new(&key); let nonce = Aes256Gcm::generate_nonce(&mut OsRng); // 96-bits; unique per message let ciphertext = cipher.encrypt(&nonce, b"plaintext message".as_ref())?; let plaintext = cipher.decrypt(&nonce, ciphertext.as_ref())?; assert_eq!(&plaintext, b"plaintext message");
看文档,
open_in_place
和open_within
会返回不带 tag 的 plaintext,文档中给了例子:方案二 encrypt_and_encode 的 key 完全没有给到 secret,相当于加密密钥一直都是全 0!这就是开变量未使用 warning 的好处了。
第一个乱码有补码,用库带的去掉补码
--
👇
ppluck: gpt和文新一言知识不够新,错误一大推,解决不了了。
我网上找到了两种方法,改了改,但是加密后,解密后半部分不对。
以下是多方寻找以及源码阅读,写的demo,并未严格做好错误处理。等调通了再做各种处理
方案1:
以上执行结果,解密最后面老是有一段乱码:
方案2:
也不对,打印出来,解密报错了,待进一步一点一点分析: sec: COLIo8+YS1tui+oKOESv6bns6T28i4Fvc6Pr2GH0xHLZV/ONGrSLIkQuPxE src:
这个是基于对称加密的随机数生成,这个暂时可能需要自己写 prng 可以在ai上试下
求助AI