favetelinguis

favetelinguis

Need help converting Java encryption example to Elixir

Im writing an integration in Elixir and as one part I need to create an encrypted login string. However I have zero experience with encryption and im not able to understand the Erlang docs well enogh to understand. I would rather use pure Erlang to do this that add some dependency to a Elexir wrapper if possible.

The Java code I need to write in Elixir looks as follows.

  private String encryptAuthParameter(String user, String password)
      throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, NoSuchPaddingException,
          InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    // Construct the base for the auth parameter
    String login =
        Base64.getEncoder().encodeToString(user.getBytes())
            + ":"
            + Base64.getEncoder().encodeToString(password.getBytes())
            + ":"
            + Base64.getEncoder()
                .encodeToString(String.valueOf(System.currentTimeMillis()).getBytes());

    // RSA encrypt it using NNAPI public key
    PublicKey pubKey = getKeyFromPEM(Main.PUBLIC_KEY_FILENAME);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    byte[] encryptedBytes = cipher.doFinal(login.getBytes("UTF-8"));

    // Encode the encrypted data in Base64
    String encodedEncryptedBytes = Base64.getEncoder().encodeToString(encryptedBytes);

    return URLEncoder.encode(encodedEncryptedBytes, "UTF-8");
  }

  private static PublicKey getKeyFromPEM(String filename)
      throws NoSuchAlgorithmException, InvalidKeySpecException, IOException {
    BufferedReader reader = null;
    try {
      reader = new BufferedReader(new FileReader(filename));
      String line = null;
      String key = "";
      while (true) {
        line = reader.readLine();
        if (line == null) break;
        else if (line.startsWith("-----BEGIN PUBLIC KEY-----")) continue;
        else if (line.startsWith("-----END PUBLIC KEY-----")) continue;
        else key += line.trim();
      }
      byte[] binary = Base64.getDecoder().decode(key);
      X509EncodedKeySpec spec = new X509EncodedKeySpec(binary);
      KeyFactory kf = KeyFactory.getInstance("RSA");
      return kf.generatePublic(spec);
    } finally {
      if (reader != null) {
        reader.close();
      }
    }
  }

The only thing I have so far is:

  def encryptAuthParameter(user, password) do
    now = DateTime.utc_now() |> DateTime.to_unix(:millisecond) |> Integer.to_string()
    # Convert to Base64
    login = Base.encode64(user) <> ":" <> Base.encode64(password) <> ":" <> Base.encode64(now)
    # Use public key to encode message
    File.read!()
    # Base 64 encode the encrypted string
    login
  end

Most Liked Responses

favetelinguis

favetelinguis

Turns out it was not that hard. Here is the code that got it working.

  def encryptAuthParameter(user, password) do
    # Convert to Base64
    now_str = DateTime.utc_now() |> DateTime.to_unix(:millisecond) |> Integer.to_string()
    login_msg = Base.encode64(user) <> ":" <> Base.encode64(password) <> ":" <> Base.encode64(now_str)
    # Use public key to encode message
    raw_p_key = getKeyFromPEM(@key)
    [enc_p_key] = :public_key.pem_decode(raw_p_key)
    p_key = :public_key.pem_entry_decode(enc_p_key)
    enc_msg = :public_key.encrypt_public(login_msg, p_key)
    # Base 64 encode the encrypted string
    Base.encode64(enc_msg)
  end

  def getKeyFromPEM(filename) do
    File.read!(filename)
  end

Where Next?

Popular in Questions Top

marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

Other popular topics Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
Lily
In templates/appointment/index.html.eex: &lt;%= for appointment &lt;- @appointments do %&gt; &lt;tr&gt; &lt;td&gt;&lt;%= appoi...
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New

We're in Beta

About us Mission Statement