user: Please show me the C implementation that matches the assembly code listed below:

```asm
<rc4_crypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x150,%rsp
  mov    %rdi,-0x138(%rbp)
  mov    %esi,-0x13c(%rbp)
  mov    %rdx,-0x148(%rbp)
  mov    %ecx,-0x140(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x124(%rbp)
  jmp    L58
L38:
  mov    -0x124(%rbp),%eax
  mov    %eax,%edx
  mov    -0x124(%rbp),%eax
  cltq
  mov    %dl,-0x110(%rbp,%rax,1)
  addl   $0x1,-0x124(%rbp)
L58:
  cmpl   $0xff,-0x124(%rbp)
  jle    L38
  movl   $0x0,-0x11c(%rbp)
  mov    -0x11c(%rbp),%eax
  mov    %eax,-0x120(%rbp)
  mov    -0x120(%rbp),%eax
  mov    %eax,-0x124(%rbp)
  jmp    L15
L19:
  mov    -0x124(%rbp),%eax
  cltq
  movzbl -0x110(%rbp,%rax,1),%eax
  mov    %al,-0x126(%rbp)
  mov    -0x120(%rbp),%eax
  mov    %eax,%edx
  movzbl -0x126(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x11c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x148(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  add    %ecx,%eax
  movzbl %al,%eax
  mov    %eax,-0x120(%rbp)
  mov    -0x120(%rbp),%eax
  cltq
  movzbl -0x110(%rbp,%rax,1),%edx
  mov    -0x124(%rbp),%eax
  cltq
  mov    %dl,-0x110(%rbp,%rax,1)
  mov    -0x120(%rbp),%eax
  cltq
  movzbl -0x126(%rbp),%edx
  mov    %dl,-0x110(%rbp,%rax,1)
  addl   $0x1,-0x11c(%rbp)
  mov    -0x11c(%rbp),%eax
  cmp    -0x140(%rbp),%eax
  jl     L67
  movl   $0x0,-0x11c(%rbp)
L67:
  addl   $0x1,-0x124(%rbp)
L15:
  cmpl   $0xff,-0x124(%rbp)
  jle    L19
  movl   $0x0,-0x114(%rbp)
  mov    -0x114(%rbp),%eax
  mov    %eax,-0x118(%rbp)
  mov    -0x118(%rbp),%eax
  mov    %eax,-0x124(%rbp)
  jmp    L73
L71:
  mov    -0x118(%rbp),%eax
  add    $0x1,%eax
  movzbl %al,%eax
  mov    %eax,-0x118(%rbp)
  mov    -0x118(%rbp),%eax
  cltq
  movzbl -0x110(%rbp,%rax,1),%eax
  mov    %al,-0x126(%rbp)
  mov    -0x114(%rbp),%eax
  mov    %eax,%edx
  movzbl -0x126(%rbp),%eax
  add    %edx,%eax
  movzbl %al,%eax
  mov    %eax,-0x114(%rbp)
  mov    -0x114(%rbp),%eax
  cltq
  movzbl -0x110(%rbp,%rax,1),%eax
  mov    %al,-0x125(%rbp)
  mov    -0x118(%rbp),%eax
  cltq
  movzbl -0x125(%rbp),%edx
  mov    %dl,-0x110(%rbp,%rax,1)
  mov    -0x114(%rbp),%eax
  cltq
  movzbl -0x126(%rbp),%edx
  mov    %dl,-0x110(%rbp,%rax,1)
  mov    -0x124(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0x126(%rbp),%edx
  movzbl -0x125(%rbp),%eax
  add    %edx,%eax
  movzbl %al,%eax
  cltq
  movzbl -0x110(%rbp,%rax,1),%edx
  mov    -0x124(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x138(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  addl   $0x1,-0x124(%rbp)
L73:
  mov    -0x124(%rbp),%eax
  cmp    -0x13c(%rbp),%eax
  jl     L71
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L31
  call   <__stack_chk_fail@plt>
L31:
  leave
  ret
```

assistant: ```c
void rc4_crypt(unsigned char *data, int data_len, unsigned char *key, int key_len) {
  int i, j, k, x, y;
  unsigned char a, b, s[256];
  for (i = 0; i < 256; i++) {
    s[i] = i;
  }
  for (i = j = k = 0; i < 256; i++) {
    a = s[i];
    j = (unsigned char)(j + a + key[k]);
    s[i] = s[j];
    s[j] = a;
    if (++k >= key_len)
      k = 0;
  }
  for (i = x = y = 0; i < data_len; i++) {
    x = (unsigned char)(x + 1);
    a = s[x];
    y = (unsigned char)(y + a);
    s[x] = b = s[y];
    s[y] = a;
    data[i] ^= s[(unsigned char)(a + b)];
  }
}
```