2个不稳定版本
0.2.0 | 2020年7月23日 |
---|---|
0.1.0 | 2019年3月7日 |
在密码学类别中排名第836
82KB
1K SLoC
bacon-cipher
Bacon密码的实现。
该包提供编码解码器和隐写术工具,用于隐藏和揭示编码后的信息。
可用的编码解码器
-
CharCodec:一种将类型为
char
的数据进行编码的编码解码器。编码通过使用类型为
T
的两个给定元素 (elem_a
和elem_b
) 进行替换来完成。替换使用Bacon密码的第一个版本进行。
-
CharCodecV2:一种将类型为
char
的数据进行编码的编码解码器。编码通过使用类型为
T
的两个给定元素 (elem_a
和elem_b
) 进行替换来完成。替换使用Bacon密码的第二个版本进行。
可用的隐写术工具
-
LetterCaseSteganographer:基于字符大小写应用隐写术。
例如,小写用于Bacon元素A,大写用于Bacon元素B。
-
MarkdownSteganographer:基于元素周围的Markdown标签应用隐写术。
例如,使用
**
将元素包围起来表示Bacon元素A,其余元素视为Bacon元素B。 -
SimpleTagSteganographer:基于元素周围的HTML或XML标签应用隐写术。(需要
extended-steganography
功能)例如,使用
<b>
和</b>
将元素包围起来表示Bacon元素A,使用<i>
和</i>
将元素包围起来表示Bacon元素B。
编码 - 解码
将消息编码为Bacon码
use bacon_cipher::codecs::char_codec::CharCodec;
use bacon_cipher::BaconCodec;
use std::iter::FromIterator;
// Define a Bacon Codec that encodes using the characters 'A' and 'B'
let codec = CharCodec::new('A', 'B');
// This is the secret to encode
let secret: Vec<char> = "My secret".chars().collect();
// Get the encoded chars
let encoded_chars = codec.encode(&secret);
let encoded_string = String::from_iter(encoded_chars.iter());
assert_eq!("ABABBBABBABAAABAABAAAAABABAAAAAABAABAABA", encoded_string);
解码Bacon码
use bacon_cipher::codecs::char_codec::CharCodec;
use bacon_cipher::BaconCodec;
use std::iter::FromIterator;
// Define a Bacon Codec that encodes using the characters 'A' and 'B'
let codec = CharCodec::new('A', 'B');
// These are the encoded characters
let encoded_chars: Vec<char> = "ABABBBABBABAAABAABAAAAABABAAAAAABAABAABA".chars().collect();
// Retrieve the decoded chars
let decoded = codec.decode(&encoded_chars);
let string = String::from_iter(decoded.iter());
assert_eq!("MYSECRET", string);
隐写术
字母大小写
将隐藏信息伪装成公开信息
use bacon_cipher::codecs::char_codec::CharCodec;
use bacon_cipher::stega::letter_case::LetterCaseSteganographer;
use bacon_cipher::{BaconCodec, Steganographer};
use std::iter::FromIterator;
// Define a Bacon Codec that encodes using the characters 'A' and 'B'
let codec = CharCodec::new('a', 'b');
// Apply steganography based on the case of the characters
let s = LetterCaseSteganographer::new();
// This is the public message in which we want to hide the secret one.
let public_chars: Vec<char> = "This is a public message that contains a secret one".chars().collect();
// This is the message that we want to hide.
let secret_chars: Vec<char> = "My secret".chars().collect();
// This is the public message that contains the secret one
let disguised_public = s.disguise(&secret_chars, &public_chars, &codec);
let string = String::from_iter(disguised_public.unwrap().iter());
assert!(string == "tHiS IS a PUbLic mEssAge thaT cOntains A seCreT one");
从公开信息中揭示隐藏信息
use bacon_cipher::codecs::char_codec::CharCodec;
use bacon_cipher::stega::letter_case::LetterCaseSteganographer;
use bacon_cipher::{BaconCodec, Steganographer};
use std::iter::FromIterator;
// Define a Bacon Codec that encodes using the characters 'A' and 'B'
let codec = CharCodec::new('a', 'b');
// Apply steganography based on the case of the characters
let s = LetterCaseSteganographer::new();
// This is the public message that contains a hidden message
let public_chars: Vec<char> = "tHiS IS a PUbLic mEssAge thaT cOntains A seCreT one".chars().collect();
// This is the hidden message
let output = s.reveal(&public_chars, &codec);
let hidden_message = String::from_iter(output.unwrap().iter());
assert!(hidden_message.starts_with("MYSECRET"));
Markdown
将隐藏信息伪装成公开信息
use bacon_cipher::codecs::char_codec::CharCodec;
use bacon_cipher::stega::markdown::{MarkdownSteganographer, Marker};
use bacon_cipher::{BaconCodec, Steganographer};
use std::iter::FromIterator;
// Define a Bacon Codec that encodes using the characters 'A' and 'B'
let codec = CharCodec::new('a', 'b');
// Apply steganography based on Markdown markers
let s = MarkdownSteganographer::new(
Marker::empty(),
Marker::new(
Some("*"),
Some("*"))).unwrap();
// This is the public message in which we want to hide the secret one.
let public = "This is a public message that contains a secret one";
// This is the message that we want to hide.
let secret_chars: Vec<char> = "My secret".chars().collect();
let output = s.disguise(
&secret_chars,
&Vec::from_iter(public.chars()),
&codec);
let string = String::from_iter(output.unwrap().iter());
assert!(string == "T*h*i*s* *is* a *pu*b*l*ic m*e*ss*a*ge tha*t* c*o*ntains *a* se*c*re*t* one");
从公开信息中揭示隐藏信息
use bacon_cipher::codecs::char_codec::CharCodec;
use bacon_cipher::stega::markdown::{MarkdownSteganographer, Marker};
use bacon_cipher::{BaconCodec, Steganographer};
use std::iter::FromIterator;
// Define a Bacon Codec that encodes using the characters 'A' and 'B'
let codec = CharCodec::new('a', 'b');
// Apply steganography based on Markdown markers
let s = MarkdownSteganographer::new(
Marker::empty(),
Marker::new(
Some("*"),
Some("*"))).unwrap();
// This is the public message that contains a hidden message
let public = "T*h*i*s* *is* a *pu*b*l*ic m*e*ss*a*ge tha*t* c*o*ntains *a* se*c*re*t* one";
// This is the hidden message
let output = s.reveal(
&Vec::from_iter(public.chars()),
&codec);
assert!(output.is_ok());
let string = String::from_iter(output.unwrap().iter());
assert!(string.starts_with("MYSECRET"));
许可证
根据您的选择,在
- Apache License,版本2.0,(https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (http://opensource.org/licenses/MIT)
依赖项
~0–320KB