java - swift中是否有像java中的密码方法?
问题描述
我正在尝试解密,但我真的不知道常见的加密在 Swift 上是如何工作的。我在java中有这段代码,我必须转换为Swift,但我没有成功
我正在使用 swift 4.2 和 Java 8
这个函数在java中工作
private static final String CIPHER_NAME = "DESede";
private static final String ALGORITHM = "MD5";
private static final String SECRET_KEY = "p3tr1c0r";
public static String decrypt(String encryptedText) {
String base64EncryptedString;
try{
byte[] message = Base64.decodeBase64(encryptedText.getBytes(StandardCharsets.UTF_8.name()));
MessageDigest md = MessageDigest.getInstance(ALGORITHM);
byte[] digestOfPassword = md.digest(SECRET_KEY.getBytes(StandardCharsets.UTF_8.name()));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
SecretKey key = new SecretKeySpec(keyBytes, CIPHER_NAME);
Cipher decipher = Cipher.getInstance(CIPHER_NAME);
decipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainText = decipher.doFinal(message);
base64EncryptedString = new String(plainText, StandardCharsets.UTF_8.name());
}catch (UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException ex){
log.warn("Exception while trying to decrypt, using encryptedText ");
base64EncryptedString = encryptedText;
}
return encryptedText;
}
目前我有这个 md5 摘要代码,我知道如何转换为 base 64,反之亦然,我的问题是当我想转换字节时,在 java 中如果我看到日志,字节是负数,但在 swift是无符号字节,是一样的吗?我的另一个问题是cipherDesede
,swift上有类似的东西吗?
let str = "61880868013"
let buf: [UInt8] = Array(str.utf8)
func MD5(string: String) -> Data {
let messageData = string.data(using:.utf8)!
var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
messageData.withUnsafeBytes {messageBytes in
CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
}
}
return digestData
}
在java中输入是uoqrHNWzb4XMQZoTQSGsHQ==
输出为 61880868013
解决方案
在Java中,如果我看到日志,字节是负数,但在swift中是无符号字节,是一样的吗?
是的,它们是一样的。这些位的解释方式不同,但对于密码学 - 或字符编码/解码 - 只有位值本身很重要。
我的另一个问题是密码 DES-EDE,Swift 上有类似的东西吗?
Swift 本身似乎并没有做太多的加密,但你可以简单地寻找任何实现:三重 DES / TDES / TDEA / 3DES 或确实 DES-EDE(这些都是相同的)在 ECB 模式下与 PKCS#5或 PKCS#7 填充(对于三重 DES 也相同)。
一个链接显示了这个在下面使用 CCCrypt 的示例,显然它似乎被称为 3DES、ECB 和 PKCS#7 填充。
推荐阅读
- r - 之前的两个ggplot2转换为plotly获得交互
- c - 返回类型“float *”但预期为“float”时类型不兼容
- javascript - Javascript 更新 $.post 以阻止
- python - 您能否创建一个 If 语句,其中程序采取的下一步是基于列表中的项目数?
- tensorflow - Keras 中的 Resnetv2 实现
- android - 是否可以在 Google Chromecast 上切换 mkv 文件中的音轨?
- reactjs - 将字符串数据从 JSON API 转换为 js 中的 int 的任何方式或解决方案?
- flutter - 在 Intellij IDEA 中创建新的 dart 项目时,在 dart 模板下找不到 Flutter Web 应用程序选项
- c++ - C ++在模板参数中传递模板的构造函数值
- php - 如何按字节位置(字节到秒)计算音频时间?