如何在 Dart 中使用 encrypt 实现 rsa 加密
How to implement rsa encryption in Dart using encrypt
我有一个用 Koltin 编写的包,我想用 Dart 重写它。我一直在尝试使用 encrypt and pointycastle。但我遇到了问题
我将如何在 Dart 中编写此实现。
我已经开始尝试对 public 密钥进行编码
var modulusBytes = base64.decode(publicKey!);
import android.util.Base64
import java.security.KeyFactory
import java.security.NoSuchAlgorithmException
import java.security.PublicKey
import java.security.spec.InvalidKeySpecException
import java.security.spec.X509EncodedKeySpec
import javax.crypto.Cipher
object Crypto {
private const val PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADfafwfegRHqfkBiKGn/rrgrgrgrrgg" +
"2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ=="
private const val ALGORITHM = "RSA"
private const val CIPHER = "RSA/ECB/PKCS1Padding"
private fun encrypt(text: String, key: PublicKey): ByteArray? {
var cipherText: ByteArray? = null
try {
// get an RSA cipher object
val cipher = Cipher.getInstance(CIPHER)
//init cipher and encrypt the plain text using the public key
cipher.init(Cipher.ENCRYPT_MODE, key)
cipherText = cipher.doFinal(text.toByteArray())
} catch (e: Exception) {
e.printStackTrace()
}
return cipherText
}
如何在 Dart 中使用字节数组?
我也有这个作为尝试加密 Koltin 中数据的一部分。
@Throws(SecurityException::class)
fun encrypt(text: String): String {
return String(Base64.encode(encrypt(text, getPublicKeyFromString(PUBLIC_KEY)), Base64.NO_WRAP))
}
@Throws(SecurityException::class)
private fun getPublicKeyFromString(pubKey: String): PublicKey {
val key: PublicKey
try {
//init keyFactory
val kf = KeyFactory.getInstance(ALGORITHM)
//decode the key into a byte array
val keyBytes = Base64.decode(pubKey, Base64.NO_WRAP)
//create spec
val spec = X509EncodedKeySpec(keyBytes)
//generate public key
key = kf.generatePublic(spec)
} catch (e: InvalidKeySpecException) {
throw SecurityException("Invalid public key: " + e.message)
} catch (e: NoSuchAlgorithmException) {
throw SecurityException("Invalid public key: " + e.message)
}
return key
}
}
我用了两个插件basic_utils
and pointycastle
。
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:basic_utils/basic_utils.dart';
import 'package:flutter/services.dart';
import 'package:pointycastle/export.dart';
class Cryptom {
/// String Public Key
String publickey =
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANIsL+RHqfkBiKGn/D1y1QnNrMkKzxWP" +
"2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ==";
String encrypt(String plaintext, String publicKey) {
/// After a lot of research on how to convert the public key [String] to [RSA PUBLIC KEY]
/// We would have to use PEM Cert Type and the convert it from a PEM to an RSA PUBLIC KEY through basic_utils
var pem =
'-----BEGIN RSA PUBLIC KEY-----\n$publickey\n-----END RSA PUBLIC KEY-----';
var public = CryptoUtils.rsaPublicKeyFromPem(pem);
/// Initalizing Cipher
var cipher = PKCS1Encoding(RSAEngine());
cipher.init(true, PublicKeyParameter<RSAPublicKey>(public));
/// Converting into a [Unit8List] from List<int>
/// Then Encoding into Base64
Uint8List output =
cipher.process(Uint8List.fromList(utf8.encode(plaintext)));
var base64EncodedText = base64Encode(output);
return base64EncodedText;
}
String text(String text) {
return encrypt(text, publickey);
}
}
然后到运行:
String? result = Cryptom().text("TEXT TO BE ENCRYPTED");
print(result);
我有一个用 Koltin 编写的包,我想用 Dart 重写它。我一直在尝试使用 encrypt and pointycastle。但我遇到了问题
我将如何在 Dart 中编写此实现。
我已经开始尝试对 public 密钥进行编码
var modulusBytes = base64.decode(publicKey!);
import android.util.Base64
import java.security.KeyFactory
import java.security.NoSuchAlgorithmException
import java.security.PublicKey
import java.security.spec.InvalidKeySpecException
import java.security.spec.X509EncodedKeySpec
import javax.crypto.Cipher
object Crypto {
private const val PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADfafwfegRHqfkBiKGn/rrgrgrgrrgg" +
"2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ=="
private const val ALGORITHM = "RSA"
private const val CIPHER = "RSA/ECB/PKCS1Padding"
private fun encrypt(text: String, key: PublicKey): ByteArray? {
var cipherText: ByteArray? = null
try {
// get an RSA cipher object
val cipher = Cipher.getInstance(CIPHER)
//init cipher and encrypt the plain text using the public key
cipher.init(Cipher.ENCRYPT_MODE, key)
cipherText = cipher.doFinal(text.toByteArray())
} catch (e: Exception) {
e.printStackTrace()
}
return cipherText
}
如何在 Dart 中使用字节数组?
我也有这个作为尝试加密 Koltin 中数据的一部分。
@Throws(SecurityException::class)
fun encrypt(text: String): String {
return String(Base64.encode(encrypt(text, getPublicKeyFromString(PUBLIC_KEY)), Base64.NO_WRAP))
}
@Throws(SecurityException::class)
private fun getPublicKeyFromString(pubKey: String): PublicKey {
val key: PublicKey
try {
//init keyFactory
val kf = KeyFactory.getInstance(ALGORITHM)
//decode the key into a byte array
val keyBytes = Base64.decode(pubKey, Base64.NO_WRAP)
//create spec
val spec = X509EncodedKeySpec(keyBytes)
//generate public key
key = kf.generatePublic(spec)
} catch (e: InvalidKeySpecException) {
throw SecurityException("Invalid public key: " + e.message)
} catch (e: NoSuchAlgorithmException) {
throw SecurityException("Invalid public key: " + e.message)
}
return key
}
}
我用了两个插件basic_utils
and pointycastle
。
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:basic_utils/basic_utils.dart';
import 'package:flutter/services.dart';
import 'package:pointycastle/export.dart';
class Cryptom {
/// String Public Key
String publickey =
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANIsL+RHqfkBiKGn/D1y1QnNrMkKzxWP" +
"2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ==";
String encrypt(String plaintext, String publicKey) {
/// After a lot of research on how to convert the public key [String] to [RSA PUBLIC KEY]
/// We would have to use PEM Cert Type and the convert it from a PEM to an RSA PUBLIC KEY through basic_utils
var pem =
'-----BEGIN RSA PUBLIC KEY-----\n$publickey\n-----END RSA PUBLIC KEY-----';
var public = CryptoUtils.rsaPublicKeyFromPem(pem);
/// Initalizing Cipher
var cipher = PKCS1Encoding(RSAEngine());
cipher.init(true, PublicKeyParameter<RSAPublicKey>(public));
/// Converting into a [Unit8List] from List<int>
/// Then Encoding into Base64
Uint8List output =
cipher.process(Uint8List.fromList(utf8.encode(plaintext)));
var base64EncodedText = base64Encode(output);
return base64EncodedText;
}
String text(String text) {
return encrypt(text, publickey);
}
}
然后到运行:
String? result = Cryptom().text("TEXT TO BE ENCRYPTED");
print(result);