ProxymanApp / Proxyman

Modern. Native. Delightful Web Debugging Proxy for macOS, iOS, and Android ⚡️
https://proxyman.io
5.58k stars 187 forks source link

Support AES 128 Encrypt/Decrypt in Scripting Addon #734

Open NghiaTranUIT opened 3 years ago

NghiaTranUIT commented 3 years ago

Description

Some users would like to decrypt their response with AES-128 by using the Scripting Tool. We should support it 👍

Acceptance Criteria

NghiaTranUIT commented 3 years ago

It's done with this BETA build: https://proxyman.s3.us-east-2.amazonaws.com/beta/Proxyman_2.15.0_Support_Crypto_Addon.dmg

Screen_Shot_2020-12-22_at_20_11_39

function onRequest(context, url, request) {

// Decrypt AES var ciphertext = 'U2FsdGVkX1+sCIKOY6nMXWAJtkZn9jSUA+/3g+HXuAdcyqKFHLlXkgPAR+lK5Xw4'; var password = 'secret key 123'; var originalText = decryptAES(ciphertext, password); console.log(originalText);

// Done return request; }

function onResponse(context, url, request, response) {

// Done return response; }


- How the CryptJS.js (~/Library/Application Support/com.proxyman.NSProxy/addons/CryptoJS.js) looks like
```js
/**
    {
        "name":"Crypto-js Wrapper. JavaScript library of crypto standards.",
        "description":"https://www.npmjs.com/package/crypto-js",
        "version": "3.3.0",
        "tags":"security, crypto, Hash, MD5, SHA1, SHA-1, SHA256, SHA-256, RC4, Rabbit, AES, DES, PBKDF2, HMAC, OFB, CFB, CTR, CBC, Base64"
    }
**/

// It's 3.3.0, not 4.0.0 since it doesn't work
// https://github.com/brix/crypto-js/issues/256
const CryptoJS = require('@libs/crypto-js.min.js');

const encryptAES = (input, password) => {
    return CryptoJS.AES.encrypt(input, password).toString();
}

const decryptAES = (ciphertext, password) => {
    var bytes  = CryptoJS.AES.decrypt(ciphertext, password);
    var originalText = bytes.toString(CryptoJS.enc.Utf8);
    return originalText;
}

const encryptDES = (input, password) => {
    return CryptoJS.DES.encrypt(input, password).toString();
}

const decryptDES = (ciphertext, password) => {
    var bytes  = CryptoJS.DES.decrypt(ciphertext, password);
    var originalText = bytes.toString(CryptoJS.enc.Utf8);
    return originalText;
}

const encryptRabbit = (input, password) => {
    return CryptoJS.Rabbit.encrypt(input, password).toString();
}

const decryptRabbit = (ciphertext, password) => {
    var bytes  = CryptoJS.Rabbit.decrypt(ciphertext, password);
    var originalText = bytes.toString(CryptoJS.enc.Utf8);
    return originalText;
}

exports.encryptAES = encryptAES;
exports.decryptAES = decryptAES;
exports.encryptDES = encryptDES;
exports.decryptDES = decryptDES;
exports.encryptRabbit = encryptRabbit;
exports.decryptRabbit = decryptRabbit;