RSA Crypto

This example shows how to use our eni_crypto.so to do RSA encrypt / decrypt.

Compiler RSACrypto Contract

There is a simple contract that leverage ENI to do RSA encrypt / decrypt.

pragma lity ^1.2.4;

contract RSACrypto {
    function encrypt(string pubkey, string plaintext) public pure returns (string) {
        string memory ret;
        ret = eni("rsa_encrypt", pubkey, plaintext);
        return ret;
    }

    function decrypt(string prikey, string ciphertext) public pure returns (string) {
        string memory ret;
        ret = eni("rsa_decrypt", prikey, ciphertext);
        return ret;
    }
}

and we could compile it using lityc:

$ mkdir output
$ lityc --abi --bin -o output RSACrypto.sol
$ cat output/RSACrypto.abi
[{"constant":true,"inputs":[{"name":"pubkey","type":"string"},{"name":"plaintext","type":"string"}],"name":"encrypt","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"prikey","type":"string"},{"name":"ciphertext","type":"string"}],"name":"decrypt","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"}]
$ cat output/RSACrypto.bin
608060405234801561001057600080fd5b506105e9806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063125704b81461005157806325f1a7cf14610179575b600080fd5b34801561005d57600080fd5b506100fe600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506102a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561013e578082015181840152602081019050610123565b50505050905090810190601f16801561016b5780820d805160018360200d6101000a0d1916815260200191505b509250505060405180910390f35b34801561018557600080fd5b50610226600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061042f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026657808201518184015260208101905061024b565b50505050905090810190601f1680156102935780820d805160018360200d6101000a0d1916815260200191505b509250505060405180910390f35b60608060405160206040519081016040526002905260206040519081016040527f0404000000000000000000000000000000000000000000000000000000000000905260206040519081016040526001905260206040519081016040527f04000000000000000000000000000000000000000000000000000000000000009052602060405190810160405280600090528580516020019081601f0160209004602002604051908101604052905b602083101515610373578051825260208201915060208101905060208303925061034e565b6001836020036101000a0d80198251168184511680821785525050505050508480516020019081601f0160209004602002604051908101604052905b6020831015156103d457805182526020820191506020810190506020830392506103af565b6001836020036101000a0d801982511681845116808217855250505050505080604051819003602090039052907f7273615f656e6372797074000000000000000000000000000000000000000000f590508091505092915050565b60608060405160206040519081016040526002905260206040519081016040527f0404000000000000000000000000000000000000000000000000000000000000905260206040519081016040526001905260206040519081016040527f04000000000000000000000000000000000000000000000000000000000000009052602060405190810160405280600090528580516020019081601f0160209004602002604051908101604052905b60208310151561050157805182526020820191506020810190506020830392506104dc565b6001836020036101000a0d80198251168184511680821785525050505050508480516020019081601f0160209004602002604051908101604052905b602083101515610562578051825260208201915060208101905060208303925061053d565b6001836020036101000a0d801982511681845116808217855250505050505080604051819003602090039052907f7273615f64656372797074000000000000000000000000000000000000000000f5905080915050929150505600a165627a7a72305820dedc75be336fe109b96f981cff70ef6b25b50c191b49a74fc77fd175d92101590029

Deploy contract to Travis locally

After we get contract ABI and bytecode, we could deploy it to Travis chain.

# Get Travis console
travis attach http://127.0.0.1:8545

# Deploy contract (in Travis console)
personal.unlockAccount(cmt.accounts[0], '1234');
abi = [{"constant":true,"inputs":[{"name":"pubkey","type":"string"},{"name":"plaintext","type":"string"}],"name":"encrypt","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"prikey","type":"string"},{"name":"ciphertext","type":"string"}],"name":"decrypt","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"}]
bytecode = "0x608060405234801561001057600080fd5b506105e9806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063125704b81461005157806325f1a7cf14610179575b600080fd5b34801561005d57600080fd5b506100fe600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506102a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561013e578082015181840152602081019050610123565b50505050905090810190601f16801561016b5780820d805160018360200d6101000a0d1916815260200191505b509250505060405180910390f35b34801561018557600080fd5b50610226600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061042f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561026657808201518184015260208101905061024b565b50505050905090810190601f1680156102935780820d805160018360200d6101000a0d1916815260200191505b509250505060405180910390f35b60608060405160206040519081016040526002905260206040519081016040527f0404000000000000000000000000000000000000000000000000000000000000905260206040519081016040526001905260206040519081016040527f04000000000000000000000000000000000000000000000000000000000000009052602060405190810160405280600090528580516020019081601f0160209004602002604051908101604052905b602083101515610373578051825260208201915060208101905060208303925061034e565b6001836020036101000a0d80198251168184511680821785525050505050508480516020019081601f0160209004602002604051908101604052905b6020831015156103d457805182526020820191506020810190506020830392506103af565b6001836020036101000a0d801982511681845116808217855250505050505080604051819003602090039052907f7273615f656e6372797074000000000000000000000000000000000000000000f590508091505092915050565b60608060405160206040519081016040526002905260206040519081016040527f0404000000000000000000000000000000000000000000000000000000000000905260206040519081016040526001905260206040519081016040527f04000000000000000000000000000000000000000000000000000000000000009052602060405190810160405280600090528580516020019081601f0160209004602002604051908101604052905b60208310151561050157805182526020820191506020810190506020830392506104dc565b6001836020036101000a0d80198251168184511680821785525050505050508480516020019081601f0160209004602002604051908101604052905b602083101515610562578051825260208201915060208101905060208303925061053d565b6001836020036101000a0d801982511681845116808217855250505050505080604051819003602090039052907f7273615f64656372797074000000000000000000000000000000000000000000f5905080915050929150505600a165627a7a72305820dedc75be336fe109b96f981cff70ef6b25b50c191b49a74fc77fd175d92101590029"
contract = web3.cmt.contract(abi);
c = contract.new(
  {
    from: web3.cmt.accounts[0],
    data: bytecode,
    gas: "4700000"
  },
  function(e, contract) {
    if (contract.address) {
      console.log("contract address: " + contract.address);
      console.log("transactionHash: " + contract.transactionHash);
    }
  }
);

Use contract to do RSA encrypt / decrypt

# Setup private & public keys
prikey = "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEApr/atzUuBArbsWHkn8tUmq00tCV4CcLfVUVg+zr41sixYIb5\n4rd5EFWoQ1xecYMZIbnoTl2vu9awHBZF18DkNlG8pjw1Vw5EjaWrCDn734lcKGhs\nYe20H7138XgznwhJNuAeNy2OOwbEIkSl4jf8Ro+7nOuMK5yeHXAPZEMCnEipd/7g\nGk0aWP/E1XoqkZJnBUYN5N6mOgtV3jv62w+XlNlozUySI0mBmjgyymAhPm4qx5Zc\nf/Wmg42vbIFRrBl5PgWKGsY0L7xcPRDPAPRtndUPr+CLLk5KjyHI8a2WiYrJvjUG\nTQNyqPM5MmLLfHMkjkbE6DshWbMZona+/5ji3wIDAQABAoIBAAjwNdAmSJ4s2tPq\nVHAAXTuhVzbk30deq8wNWQJ+icIxpdhvw8tUXGf0v31E4UciaOF27q3stbPS8UPA\nKeRD0bfbr8oVZiKRgDk7jSx2tzqnSUpdNpoVPNeKt3g5IkM/FXWck+IPThV56l+P\n4Hh82cgKglsKAUyBK7SWQiz0rpoj8MWlkG0TblsMVLnOTAO0N3p3NiHxv1eUJrHK\nwyI42Mkb+nUm1jKSUAg9JuOQJUWcKzlgs8Z4+gvvOukO1tTs4EBMZdn2wYC0+BSE\nqB0Sx496fuIZ0YPExwF21h2bansEuG2kN5OnW80vnUT724bGvGv3yffyK3fZhE2M\nWdwDJtkCgYEA3Vw/O8cRxSv6gU4bWH6YE24XQz/pRvOsLLcQeXrxbxvm1ZsD65ou\ntpvA0/eF3c5KRAhoqgRGPDV7eHvRdo9v6Ih4mwp6wR9bEGU3beHCIjZPb5nCCGtk\nTCNiVt+MIXKBHXt9lKBjTnmbCvRt+chRz8yFwRpdu49GawOX6NY8YasCgYEAwNfh\nTbTRawCqC1WY1weFIn9y9NN1reFVvYZhb6stdfBUVAG6vjB0dGG0bZCJUH/+h65/\nAuvahIugw5AA+H8iTTeB2KpgCc2FmiUviohug39GMz6oabkzZH9KAZjCf5/zMhm3\nIvtVDMDXBJah7SFYsxM1sBfklPAHFlAe7zP/950CgYBM60IZzonRPv/0MKT18j97\n+PRibPHtsrywaQhzfhIpLsPek9gf5Vq4H5U40rkUoxtRWq6r7YJOZ7M44aWekicr\n4Ugvb8vKEdA9+T3yk9E2vDKMMBypek/G2UDRuSpjcPuGuCOiIr1/RmhmvRr+AerT\nz1jnCfdqNlYc14nQ4ajnswKBgDtlAj6lt25mePketwFbjpTOfkCLtI4Gfhrufaog\nJdNSXxa0paiYUfXadfDc+H3zvhhaFUJ4FAiI3M3+112yAoWX2AU8jHHYfBK660aW\nuLsFg0CbRtGxOfP1BH0zaIxYXlYK943trQdNiawfHOZlQ+V7wChpY3y/5N7pdG2m\nLWs9AoGBAMEgKXwA2ubWrxe622PHXwgUx9oja3LwmuT3oQZDtwxfs4lw3xzIgGps\nWVvgNL2aceE/qkI032ysKTIbM3JvKa7AzrGKDi8XbyE98QSKM9qyFmdrTG7UIbSo\nDNen8V4qgCV/z34+6uxWMR7AozgQmzrKogmxhZpIYdyqO4F35cMb\n-----END RSA PRIVATE KEY-----";
pubkey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApr/atzUuBArbsWHkn8tU\nmq00tCV4CcLfVUVg+zr41sixYIb54rd5EFWoQ1xecYMZIbnoTl2vu9awHBZF18Dk\nNlG8pjw1Vw5EjaWrCDn734lcKGhsYe20H7138XgznwhJNuAeNy2OOwbEIkSl4jf8\nRo+7nOuMK5yeHXAPZEMCnEipd/7gGk0aWP/E1XoqkZJnBUYN5N6mOgtV3jv62w+X\nlNlozUySI0mBmjgyymAhPm4qx5Zcf/Wmg42vbIFRrBl5PgWKGsY0L7xcPRDPAPRt\nndUPr+CLLk5KjyHI8a2WiYrJvjUGTQNyqPM5MmLLfHMkjkbE6DshWbMZona+/5ji\n3wIDAQAB\n-----END PUBLIC KEY-----";

# Encrypt
> ciphertext = c.encrypt.call(pubkey, 'Hello World!')
"49d511a44a3d2a2437f00a72fef6915fd0fcd669e90bd2f62387c6bdd3028ecc5b8799bae0a8bae606655046c87416297b5e8e130359fca8e612ab10f0dfe1a9abdceb3f62b5edf20a4c3925f9129782e7a51020a7252b056afca88a4f087bd5700737accdd2867adcf429818edacd936ffe8afd013893dd0d268f335e3bb3c8f2853dd490a7c52b6eec428138aecf26563ce06ef517d2f643b9cacb1bfda0ade8c530f550c0d4fb170fcdeeebad2f362bb6fb83484754fea03df53e0f06ca4b7c98f91685a293bae854d8a6cde108726468cc3e927eeb5dec6de6d11ca30e59ab81c5019a217453ce984edcea652a91a40d448fd5981b01aececb258e70282a"

# Decrypt
> c.decrypt.call(prikey, ciphertext)
"Hello World!"