【问题标题】:How to do RSA encryption for IOS using Ionic如何使用 Ionic 为 IOS 进行 RSA 加密
【发布时间】:2016-07-05 14:01:51
【问题描述】:

我正在开发一个原生 android 应用和混合 IOS 应用。在将请求发送给 BL 之前,我正在加密密码。下面是我的原生代码。

public String Encrypt (String plain) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
    try {
        AssetManager assets = context.getAssets();
        byte[] key = readFully(
                assets.open("encryption.der", AssetManager.ACCESS_BUFFER));
        KeySpec publicKeySpec = new X509EncodedKeySpec(key);

        KeyFactory kf = KeyFactory.getInstance("RSA");
        Key pk = kf.generatePublic(publicKeySpec);

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pk);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        CipherOutputStream cout = new CipherOutputStream(out, cipher);
        try {
            cout.write(plain.getBytes(UTF_8));
            cout.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                cout.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
        }
        encrypted  = new String(encode(out.toByteArray(), DEFAULT), "UTF-8");

        return encrypted;
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }

    return null;

}

static byte[] readFully(InputStream inputStream) throws IOException {
        InputStream in = new BufferedInputStream(inputStream);
        byte[] tmp = new byte[1024];
        int readLen, size = 0;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        while ((readLen = in.read(tmp)) != -1) {
            if (((long) size + readLen) > Integer.MAX_VALUE) {
                // woah! did we just ship an app of 2GB?
                throw new IllegalStateException("Invalid file. File size exceeds expected "
                        + "maximum of 2GB");
            }
            size += readLen;
            out.write(tmp, 0, readLen);
        }
        return out.toByteArray();
    }

我的密钥在 encryption.der 文件中。在android中一切正常。现在来到我正在使用 Ionic 开发的 IOS。我无法实现加密部分。我使用了“cryptico”:链接:https://github.com/wwwtyro/cryptico/blob/master/README.md。 最后像这样转换为 Base64。

var EncryptionPassword = cryptico.encrypt($scope.userInfo.Password, publicKey);
$scope.encPass = base64.encode(EncryptionPassword.cipher);

但我从 BL 收到 ArrayIndexOutOfBound 异常。您能否建议完全相同的解决方案也具有适用于 angularjs 的 android。所以 RSA 加密适用于 IOS 和 Android。

【问题讨论】:

    标签: android ios angularjs ionic-framework public-key-encryption


    【解决方案1】:
    1. 创建一个服务并将您的公钥放入其中。

      .service('设置', function(){

      this.publicKey = 'MIIBIjANBgdcssvsvsfvsfvsfvrefvfvfviuwoihijwfoiw278499080989i09M + KC8MYYOu / NRLmFg85LRrfRszyI / VZ / k8982789uiwbgchdbhU + 3joQZoJ3Sxq / GbIIFf / 3y4f9DuKI53y1qR2qD4xIskfa9rPVqvBtAu2KSNRd8V4J8RKI2gT2YEA + A3Z0mQq4GBRS8iYmGLqRQyPfNUSankylBrTpOIVFBZORdZehjJMmwl98UynyfnyMIHUIFuhefuibiufbeufbsoijn93fD7nxt + siZryfazn3EAgBaTKTV / U5xIepzDN6ZYJ4qnC93u6erdb1X4m1zU6RGapwzCOPOORTyzw / uWJ8twcODNt0cqVp + sYQIDAQAB'; })

      1. 现在在您的 JS 中使用公钥和 JSEncrypt 进行加密。

      var encrypt = new JSEncrypt(); encrypt.setPublicKey(Settings.publicKey); EncryptionPin = encrypt.encrypt($scope.customerInfo.Pin);

    EncryptionPin 是最终的密钥。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多