首页 > 解决方案 > 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

标签: javaswiftencryption

解决方案


在Java中,如果我看到日志,字节是负数,但在swift中是无符号字节,是一样的吗?

是的,它们是一样的。这些位的解释方式不同,但对于密码学 - 或字符编码/解码 - 只有位值本身很重要。

我的另一个问题是密码 DES-EDE,Swift 上有类似的东西吗?

Swift 本身似乎并没有做太多的加密,但你可以简单地寻找任何实现:三重 DES / TDES / TDEA / 3DES 或确实 DES-EDE(这些都是相同的)在 ECB 模式下与 PKCS#5或 PKCS#7 填充(对于三重 DES 也相同)。

一个链接显示了这个在下面使用 CCCrypt 的示例,显然它似乎被称为 3DES、ECB 和 PKCS#7 填充。


推荐阅读