1use std::fmt::{Display, Formatter};
8
9use openssl::error::ErrorStack;
10use openssl::pkey::Private;
11use openssl::rsa::{Padding, Rsa};
12use openssl::symm::{decrypt, encrypt, Cipher};
13use sha2::{Digest, Sha256 as sha2_256, Sha512 as sha2_512};
14
15use crate::error::{InvalidArgumentError, LibError, MissingArgumentError};
16
17#[derive(PartialEq, Debug)]
47pub struct CryptoError {
48 message: String,
49}
50
51impl Default for CryptoError {
52 fn default() -> Self {
53 CryptoError {
54 message: "암호화 처리중 오류가 발생하였습니다.".to_owned(),
55 }
56 }
57}
58
59impl Display for CryptoError {
60 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
61 write!(f, "Encrypt/Decrypt error.")
62 }
63}
64
65impl From<&str> for CryptoError {
66 fn from(value: &str) -> Self {
67 CryptoError {
68 message: value.to_owned(),
69 }
70 }
71}
72
73impl LibError for CryptoError {
74 fn get_message(&self) -> &str {
75 self.message.as_str()
76 }
77
78 fn get_type_name_from_instance(&self) -> &str {
79 std::any::type_name::<CryptoError>()
80 }
81}
82
83#[derive(PartialEq)]
86#[allow(non_camel_case_types)]
87pub enum SHA_TYPE {
88 SHA_256,
90
91 SHA_512,
93}
94
95#[derive(PartialEq)]
97#[allow(non_camel_case_types)]
98pub enum AES_TYPE {
99 AES_128,
101
102 AES_256,
104}
105
106pub fn make_sha_hash(
151 hash_type: SHA_TYPE,
152 target: &[u8],
153 salt: Option<&str>,
154) -> Result<Box<[u8]>, MissingArgumentError> {
155 if target.is_empty() {
156 return Err(MissingArgumentError::from("Hash 대상이 빈 문자열 입니다."));
157 }
158
159 return match hash_type {
160 SHA_TYPE::SHA_256 => _hash_::<sha2_256>(target, salt),
161 SHA_TYPE::SHA_512 => _hash_::<sha2_512>(target, salt),
162 };
163
164 fn _hash_<D: Digest>(
165 target: &[u8],
166 salt: Option<&str>,
167 ) -> Result<Box<[u8]>, MissingArgumentError> {
168 let mut _hash = D::new();
169
170 _hash.update(target);
171
172 if !salt.is_none() && !salt.unwrap().is_empty() {
173 _hash.update(salt.unwrap().as_bytes());
174 }
175
176 let result: Vec<u8> = _hash.finalize().to_vec();
177
178 return Ok(Box::from(result.as_slice()));
179 }
180}
181
182pub fn make_sha_hash_string(
217 hash_type: SHA_TYPE,
218 target: &[u8],
219 salt: Option<&str>,
220) -> Result<String, MissingArgumentError> {
221 let result = make_sha_hash(hash_type, target, salt);
222
223 match result {
224 Ok(r) => {
225 let v: Vec<String> = r.iter().map(|b| format!("{:02x}", b)).collect();
226
227 Ok(v.join(""))
228 }
229 Err(e) => Err(e),
230 }
231}
232
233#[derive(Debug)]
235pub struct AESResult {
236 salt: Option<Vec<u8>>,
238
239 result: Vec<u8>,
241
242 result_str: Option<String>,
244
245 iv: Vec<u8>,
247}
248
249impl AESResult {
250 fn new(salt: Option<&[u8]>, result: &[u8], iv: &[u8]) -> Self {
251 AESResult {
252 salt: match salt {
253 None => None,
254 Some(v) => Some(Vec::from(v)),
255 },
256 result: Vec::from(result),
257 result_str: {
258 let v = Vec::from(result);
259 let v: Vec<String> = v.iter().map(|b| format!("{:02x}", b)).collect();
260
261 Some(v.join(""))
262 },
263 iv: Vec::from(iv),
264 }
265 }
266
267 #[inline]
269 pub fn salt(&self) -> Option<&[u8]> {
270 return match &self.salt {
271 None => None,
272 Some(v) => {
273 return Some(v.as_ref());
274 }
275 };
276 }
277
278 #[inline]
280 pub fn result(&self) -> &[u8] {
281 self.result.as_ref()
282 }
283
284 #[inline]
286 pub fn result_str(&self) -> Option<&str> {
287 match &self.result_str {
288 None => None,
289 Some(v) => Some(v.as_str()),
290 }
291 }
292
293 #[inline]
295 pub fn iv(&self) -> &[u8] {
296 self.iv.as_ref()
297 }
298
299 #[deprecated(note = "salt(&self)로 대체. 삭제 예정.")]
305 pub fn get_salt(&self) -> Option<&[u8]> {
306 return match &self.salt {
307 None => None,
308 Some(v) => {
309 return Some(v.as_ref());
310 }
311 };
312 }
313
314 #[deprecated(note = "result(&self)로 대체. 삭제 예정.")]
316 pub fn get_result(&self) -> &[u8] {
317 return self.result.as_ref();
318 }
319
320 #[deprecated(note = "iv(&self)로 대체. 삭제 예정.")]
322 pub fn get_iv(&self) -> &[u8] {
323 return self.iv.as_ref();
324 }
325}
326
327impl Display for AESResult {
328 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
329 write!(
330 f,
331 "salt : {:#?}\n, result : {:#?}\n, iv : {:#?}",
332 self.salt, self.result, self.iv
333 )
334 }
335}
336
337pub fn validate_salt(salt: Option<&[u8]>) -> Result<(), InvalidArgumentError> {
351 return match salt {
352 None => Ok(()),
353 Some(v) => {
354 return if v.len() != 8 {
355 Err(InvalidArgumentError::from(
356 "Salt length is invalid(must 8 bytes)",
357 ))
358 } else {
359 Ok(())
360 };
361 }
362 };
363}
364
365pub fn aes_encrypt(
417 enc_type: AES_TYPE,
418 target: &[u8],
419 secret: &[u8],
420 salt: Option<&[u8]>,
421 repeat_count: usize,
422) -> Result<AESResult, Box<dyn LibError>> {
423 if target.is_empty() {
424 return Err(Box::from(InvalidArgumentError::from(
425 "암호화 대상이 빈 문자열 입니다",
426 )));
427 }
428
429 let validate_salt = validate_salt(salt);
430
431 if validate_salt.is_err() {
432 return Err(Box::from(validate_salt.err().unwrap()));
433 }
434
435 let cipher = if AES_TYPE::AES_128 == enc_type {
436 Cipher::aes_128_cbc()
437 } else {
438 Cipher::aes_256_cbc()
439 };
440 let key_spec = openssl::pkcs5::bytes_to_key(
441 cipher,
442 openssl::hash::MessageDigest::md5(),
443 secret,
444 salt,
445 repeat_count as i32,
446 );
447
448 if key_spec.is_err() {
449 eprintln!("AES error : {:#?}", key_spec.err());
450
451 return Err(Box::from(CryptoError::from(
452 "AES 암호화 처리 중 오류가 발생하였습니다.",
453 )));
454 }
455
456 let unwrapped_spec = key_spec.unwrap();
457 let key = unwrapped_spec.key;
458 let iv = unwrapped_spec.iv.unwrap();
459
460 let result: Result<Vec<u8>, ErrorStack> =
465 encrypt(cipher, key.as_slice(), Some(iv.as_slice()), target);
466
467 match result {
468 Ok(vv) => Ok(AESResult::new(salt, vv.as_slice(), iv.as_slice())),
469 Err(e) => {
470 eprintln!("AES encrypt error : {:#?}", e);
471
472 Err(Box::from(InvalidArgumentError::from("암호화 처리 오류")))
473 }
474 }
475}
476
477pub fn aes_decrypt(
526 enc_type: AES_TYPE,
527 target: Option<&[u8]>,
528 secret: &[u8],
529 iv: &[u8],
530 salt: Option<&[u8]>,
531 repeat_count: usize,
532) -> Result<Box<[u8]>, Box<dyn LibError>> {
533 match target {
534 None => Err(Box::from(MissingArgumentError::from(
535 "복호화 대상이 지정되지 않았습니다.",
536 ))),
537 Some(v) => {
538 if v.len() == 0 {
539 return Err(Box::from(InvalidArgumentError::from(
540 "복호화 대상의 길이가 0 입니다.",
541 )));
542 }
543
544 let validate_salt = validate_salt(salt);
545
546 if validate_salt.is_err() {
547 return Err(Box::from(validate_salt.err().unwrap()));
548 }
549
550 let cipher = if AES_TYPE::AES_128 == enc_type {
551 Cipher::aes_128_cbc()
552 } else {
553 Cipher::aes_256_cbc()
554 };
555 let key_spec = openssl::pkcs5::bytes_to_key(
556 cipher,
557 openssl::hash::MessageDigest::md5(),
558 secret,
559 salt,
560 repeat_count as i32,
561 );
562
563 if key_spec.is_err() {
564 eprintln!("AES error: {:#?}", key_spec.err());
565
566 return Err(Box::from(CryptoError::from(
567 "AES 복호화 처리 중 오류가 발생하였습니다.",
568 )));
569 }
570
571 let unwrapped_spec = key_spec.unwrap();
572 let key = unwrapped_spec.key;
573
574 let result = decrypt(cipher, key.as_slice(), Some(iv), v);
575
576 match result {
577 Ok(vv) => Ok(Box::from(vv.as_slice())),
578
579 Err(e) => {
580 eprintln!("AES decrypt error: {:#?}", e);
581
582 Err(Box::from(InvalidArgumentError::from("복호화 처리 오류")))
583 }
584 }
585 }
586 }
587}
588
589#[allow(non_camel_case_types)]
601pub enum RSA_BIT {
602 B_1024,
604
605 B_2048,
607
608 B_4096,
610
611 B_8192,
613}
614
615impl RSA_BIT {
616 pub fn bit(&self) -> usize {
618 match self {
619 RSA_BIT::B_1024 => 1024usize,
620 RSA_BIT::B_2048 => 2048usize,
621 RSA_BIT::B_4096 => 4096usize,
622 RSA_BIT::B_8192 => 8192usize,
623 }
624 }
625
626 pub fn bytes(&self) -> u16 {
627 match self {
628 RSA_BIT::B_1024 => 128,
629 RSA_BIT::B_2048 => 256,
630 RSA_BIT::B_4096 => 512,
631 RSA_BIT::B_8192 => 1024,
632 }
633 }
634}
635
636pub struct RSAResult {
638 public_key: Vec<u8>,
640
641 public_modulus: Vec<u8>,
643
644 public_exponent: Vec<u8>,
646
647 private_key: Vec<u8>,
649
650 private_modulus: Vec<u8>,
652
653 private_exponent: Vec<u8>,
655
656 result: Vec<u8>,
658
659 result_str: Option<String>,
661}
662
663impl RSAResult {
664 pub fn new(
665 pub_key: &[u8],
666 pub_mod: &[u8],
667 pub_exp: &[u8],
668 prv_key: &[u8],
669 prv_mod: &[u8],
670 prv_exp: &[u8],
671 result: &[u8],
672 ) -> Self {
673 RSAResult {
674 public_key: Vec::from(pub_key),
675 public_modulus: Vec::from(pub_mod),
676 public_exponent: Vec::from(pub_exp),
677 private_key: Vec::from(prv_key),
678 private_modulus: Vec::from(prv_mod),
679 private_exponent: Vec::from(prv_exp),
680 result: Vec::from(result),
681 result_str: {
682 let v = Vec::from(result);
683 let v: Vec<String> = v.iter().map(|b| format!("{:02x}", b)).collect();
684
685 Some(v.join(""))
686 },
687 }
688 }
689
690 #[inline]
692 pub fn public_key(&self) -> &[u8] {
693 self.public_key.as_ref()
694 }
695
696 #[inline]
698 pub fn public_modulus(&self) -> &[u8] {
699 self.public_modulus.as_ref()
700 }
701
702 #[inline]
704 pub fn public_exponent(&self) -> &[u8] {
705 self.public_exponent.as_ref()
706 }
707 #[inline]
709 pub fn private_key(&self) -> &[u8] {
710 self.private_key.as_ref()
711 }
712
713 #[inline]
715 pub fn private_modulus(&self) -> &[u8] {
716 self.private_modulus.as_ref()
717 }
718
719 #[inline]
721 pub fn private_exponent(&self) -> &[u8] {
722 self.private_exponent.as_ref()
723 }
724
725 #[inline]
727 pub fn result(&self) -> &[u8] {
728 self.result.as_ref()
729 }
730
731 #[inline]
733 pub fn result_str(&self) -> Option<&str> {
734 match &self.result_str {
735 None => None,
736 Some(v) => Some(v.as_str()),
737 }
738 }
739
740 #[deprecated(note = "public_key(&self)로 대체. 삭제 예정.")]
746 pub fn get_public_key(&self) -> &[u8] {
747 self.public_key.as_ref()
748 }
749
750 #[deprecated(note = "public_modulus(&self)로 대체. 삭제 예정.")]
752 pub fn get_public_modulus(&self) -> &[u8] {
753 self.public_modulus.as_ref()
754 }
755
756 #[deprecated(note = "public_exponent(&self)로 대체. 삭제 예정.")]
758 pub fn get_public_exponent(&self) -> &[u8] {
759 self.public_exponent.as_ref()
760 }
761
762 #[deprecated(note = "private_key(&self)로 대체. 삭제 예정.")]
764 pub fn get_private_key(&self) -> &[u8] {
765 self.private_key.as_ref()
766 }
767
768 #[deprecated(note = "private_modulus(&self)로 대체. 삭제 예정.")]
770 pub fn get_private_modulus(&self) -> &[u8] {
771 self.private_modulus.as_ref()
772 }
773
774 #[deprecated(note = "private_exponent(&self)로 대체. 삭제 예정.")]
776 pub fn get_private_exponent(&self) -> &[u8] {
777 self.private_exponent.as_ref()
778 }
779
780 #[deprecated(note = "result(&self)로 대체. 삭제 예정.")]
782 pub fn get_result(&self) -> &[u8] {
783 self.result.as_ref()
784 }
785}
786
787pub fn generate_rsa_keypair(bit_size: RSA_BIT) -> Result<Rsa<Private>, CryptoError> {
807 let rsa: Result<Rsa<Private>, ErrorStack> = Rsa::generate(bit_size.bit() as u32);
808
809 if rsa.is_err() {
810 eprintln!("Generate RSA key pair fail : {:#?}", rsa.err());
811
812 return Err(CryptoError::from(
813 "RSA key pair 생성 중 오류가 발생하였습니다.",
814 ));
815 }
816
817 return Ok(rsa.unwrap());
818}
819
820pub fn rsa_encrypt_without_key(
870 target: &[u8],
871 bit_size: RSA_BIT,
872) -> Result<Box<RSAResult>, CryptoError> {
873 let key_pair: Rsa<Private> = generate_rsa_keypair(bit_size)?;
874 let public_key = key_pair.public_key_to_pem();
875 let private_key = key_pair.private_key_to_pem();
876
877 if public_key.is_err() {
878 eprintln!("public key error: {:#?}", public_key.err());
879
880 return Err(CryptoError::from("Public key에서 오류가 발생하였습니다."));
881 }
882
883 if private_key.is_err() {
884 eprintln!("private key error: {:#?}", private_key.err());
885
886 return Err(CryptoError::from("Private key에서 오류가 발생하였습니다."));
887 }
888
889 let unwrapped_pub_key = public_key.unwrap();
890 let unwrapped_prv_key = private_key.unwrap();
891
892 let result = rsa_encrypt(target, unwrapped_pub_key.as_slice())?;
893
894 let rsa_result = RSAResult::new(
895 unwrapped_pub_key.as_slice(),
896 key_pair.n().to_vec().as_slice(),
897 key_pair.e().to_vec().as_slice(),
898 unwrapped_prv_key.as_slice(),
899 key_pair.n().to_vec().as_slice(),
900 key_pair.d().to_vec().as_slice(),
901 result.as_ref(),
902 );
903
904 return Ok(Box::from(rsa_result));
905}
906
907pub fn rsa_decrypt(target: &[u8], prv_key: &[u8]) -> Result<Vec<u8>, CryptoError> {
946 let private_key = Rsa::private_key_from_pem(prv_key);
947
948 if private_key.is_err() {
949 eprintln!("개인키 생성 오류: {:#?}", private_key.err());
950
951 return Err(CryptoError::from("개인키 오류가 발생하였습니다."));
952 }
953
954 let rsa = private_key.unwrap();
955 let mut buffer: Vec<u8> = vec![0; rsa.size() as usize];
956
957 let result = rsa.private_decrypt(target, &mut buffer, Padding::PKCS1);
958
959 if result.is_err() {
960 eprintln!("RSA decrypt error : {:#?}", result.err());
961
962 return Err(CryptoError::from(
963 "RSA 복호화 처리 중 오류가 발생하였습니다.",
964 ));
965 }
966
967 let real_size = result.unwrap();
968 let final_result = &buffer[0..real_size];
969
970 return Ok(Vec::from(final_result)); }
972
973fn rsa_encrypt(target: &[u8], pub_key: &[u8]) -> Result<Box<[u8]>, CryptoError> {
986 let public_key = Rsa::public_key_from_pem(pub_key).unwrap();
988 let rsa = Rsa::from(public_key);
989 let mut buffer = vec![0; rsa.size() as usize];
990 let result = rsa.public_encrypt(target, &mut buffer, Padding::PKCS1);
991
992 if result.is_err() {
993 eprintln!("RSA encrypt error : {:#?}", result.err());
994
995 return Err(CryptoError::from(
996 "RSA 암호화 처리 중 오류가 발생하였습니다.",
997 ));
998 }
999
1000 return Ok(Box::from(buffer.as_slice()));
1001}
1002
1003#[cfg(test)]
1004mod tests {
1005 use base64::prelude::*;
1006
1007 use super::*;
1008
1009 const PLAIN_TEXT: &str = "This 이것, That 저것";
1010
1011 #[test]
1012 pub fn make_sha_hash_test() {
1013 let mut result: Result<Box<[u8]>, MissingArgumentError> =
1014 make_sha_hash(SHA_TYPE::SHA_256, "test".as_bytes(), Some("salt"));
1015
1016 assert!(!result.is_err());
1017
1018 let v: Vec<String> = result
1019 .unwrap()
1020 .iter()
1021 .map(|b| format!("{:02x}", b))
1022 .collect();
1023
1024 println!("SHA-256 result : {}", v.join(""));
1025
1026 result = make_sha_hash(SHA_TYPE::SHA_512, "test".as_bytes(), Some("salt"));
1027
1028 assert!(!result.is_err());
1029
1030 let v: Vec<String> = result
1031 .unwrap()
1032 .iter()
1033 .map(|b| format!("{:02x}", b))
1034 .collect();
1035 let v = v.join("");
1036
1037 println!("SHA-512 result : {}", v);
1038
1039 let vv = make_sha_hash_string(SHA_TYPE::SHA_512, "test".as_bytes(), Some("salt"));
1040
1041 assert!(vv.is_ok(), "make_sha_hash_string error => {:#?}", vv.err());
1042
1043 assert_eq!(v, vv.unwrap(), "hash string 불일치")
1044 }
1045
1046 #[test]
1059 pub fn aes_encrypt_test() {
1060 let repeat_count = 10usize;
1061 let result: Result<AESResult, Box<dyn LibError>> = aes_encrypt(
1062 AES_TYPE::AES_128,
1063 PLAIN_TEXT.as_bytes(),
1064 "abc".as_bytes(),
1065 Some("salt".as_bytes()),
1066 10,
1067 );
1068
1069 assert!(result.is_err());
1070
1071 let err = result.err().unwrap();
1072 let err_name = err.get_type_name_from_instance();
1073
1074 assert_eq!(err_name, std::any::type_name::<InvalidArgumentError>());
1075 println!("err_name : {}", err_name);
1076
1077 let encrypt_result = aes_encrypt(
1078 AES_TYPE::AES_128,
1079 PLAIN_TEXT.as_bytes(),
1080 "abcdefgh".as_bytes(),
1081 Some("saltsalt".as_bytes()), repeat_count,
1083 );
1084
1085 assert!(!encrypt_result.is_err(), "aes 암호화 오류 발생");
1086
1087 let result_value = encrypt_result.unwrap();
1090
1091 println!("unwrapped value : {:#?}", result_value);
1092 println!("unwrapped result value : {:#?}", result_value.result);
1093
1094 assert!(result_value.result_str().is_some());
1096
1097 let raw_result: Vec<String> = result_value
1098 .result()
1099 .iter()
1100 .map(|b| format!("{:02x}", b))
1101 .collect();
1102 let raw_result: String = raw_result.join("");
1103
1104 assert_eq!(raw_result, result_value.result_str().unwrap());
1105
1106 println!("aes result str ===> {}", result_value.result_str().unwrap());
1107
1108 let encoded_value = BASE64_STANDARD.encode(result_value.result.clone());
1109
1110 println!("aes base64 encoded value : {:#?}", encoded_value);
1111
1112 let mut salt: Option<&[u8]> = None;
1113 let unwrapped_salt: Vec<u8>;
1114
1115 if result_value.salt.is_some() {
1116 unwrapped_salt = result_value.salt.unwrap();
1117 salt = Some(unwrapped_salt.as_slice());
1118 }
1119
1120 println!("final sal : {:#?}", salt);
1121
1122 let decrypt_result = aes_decrypt(
1123 AES_TYPE::AES_128,
1124 Some(result_value.result.as_ref()),
1125 b"abcdefgh",
1126 result_value.iv.as_ref(),
1127 salt,
1128 repeat_count,
1129 );
1130
1131 assert!(!decrypt_result.is_err(), "aes 복호화 오류 발생");
1132
1133 let decrypted_raw_value = decrypt_result.unwrap();
1134 let decrypted_value = decrypted_raw_value.as_ref();
1135
1136 assert_eq!(
1137 PLAIN_TEXT,
1138 String::from_utf8_lossy(decrypted_value),
1139 "복호화 값 불일치"
1140 );
1141
1142 println!(
1143 "decrypted text: {:?}",
1144 String::from_utf8_lossy(decrypted_value)
1145 );
1146 }
1147
1148 #[test]
1149 pub fn rsa_encrypt_test() {
1150 let key_pair = generate_rsa_keypair(RSA_BIT::B_4096);
1151 let result1 = rsa_encrypt(
1152 PLAIN_TEXT.as_bytes(),
1153 key_pair.unwrap().public_key_to_pem().unwrap().as_slice(),
1154 );
1155
1156 assert!(!result1.is_err(), "RSA 2048 암호화 실패");
1157
1158 let result_raw = result1.unwrap();
1159
1160 assert_eq!(
1161 result_raw.len(),
1162 RSA_BIT::B_4096.bytes() as usize,
1163 "암호화 결과 길이 불일치"
1164 );
1165
1166 println!(
1167 "rsa result(4096) : {:?}\nlength : {}",
1168 result_raw,
1169 result_raw.len()
1170 );
1171
1172 let encoded_value = BASE64_STANDARD.encode(result_raw);
1173
1174 println!("rsa base 64 encoded value : {:?}", encoded_value);
1175
1176 let key_pair = generate_rsa_keypair(RSA_BIT::B_8192);
1177 let result1 = rsa_encrypt(
1178 PLAIN_TEXT.as_bytes(),
1179 key_pair.unwrap().public_key_to_pem().unwrap().as_slice(),
1180 );
1181
1182 assert!(!result1.is_err(), "RSA 8192 암호화 실패");
1183
1184 let result_raw = result1.unwrap();
1185
1186 assert_eq!(
1187 result_raw.len(),
1188 RSA_BIT::B_8192.bytes() as usize,
1189 "암호화 결과 길이 불일치"
1190 );
1191 println!(
1192 "rsa result(8192) : {:?}\nlength : {}",
1193 result_raw,
1194 result_raw.len()
1195 );
1196
1197 let result2 = rsa_encrypt_without_key(PLAIN_TEXT.as_bytes(), RSA_BIT::B_2048);
1198
1199 assert!(result2.is_ok());
1200
1201 let result2_raw = result2.unwrap();
1202
1203 assert!(result2_raw.private_key().len() > 0, "개인키 반환 실패");
1204 assert!(
1205 result2_raw.private_exponent().len() > 0,
1206 "개인키 지수 반환 실패"
1207 );
1208 assert!(
1209 result2_raw.private_modulus().len() > 0,
1210 "개인키 계수 반환 실패"
1211 );
1212 assert!(result2_raw.public_key().len() > 0, "공개키 반환 실패");
1213 assert!(
1214 result2_raw.public_exponent().len() > 0,
1215 "공개키 지수 반환 실패"
1216 );
1217 assert!(
1218 result2_raw.public_modulus().len() > 0,
1219 "공개키 계수 반환 실패"
1220 );
1221 assert!(result2_raw.result().len() > 0, "암호화 결과 반환 실패");
1222 assert_eq!(
1223 result2_raw.result().len(),
1224 RSA_BIT::B_2048.bytes() as usize,
1225 "암호화 결과 길이 불일치"
1226 );
1227
1228 assert!(result2_raw.result_str().is_some());
1230
1231 let raw_result: Vec<String> = result2_raw
1232 .result()
1233 .iter()
1234 .map(|b| format!("{:02x}", b))
1235 .collect();
1236 let raw_result = raw_result.join("");
1237
1238 assert_eq!(raw_result, result2_raw.result_str().unwrap());
1239
1240 println!("rsa result str ===> {}", result2_raw.result_str().unwrap());
1241
1242 let decrypt2 = rsa_decrypt(result2_raw.result(), result2_raw.private_key());
1243
1244 assert!(!decrypt2.is_err());
1245
1246 let decrypt2_raw = decrypt2.unwrap();
1247 let decrypt2_result = String::from_utf8(decrypt2_raw.to_vec()).unwrap();
1248
1249 assert_eq!(decrypt2_result, PLAIN_TEXT, "복호화 실패");
1250
1251 println!("원문: {:?}\n복호화 결과: {:?}", PLAIN_TEXT, decrypt2_result);
1252 }
1253}