given that the two main things you need to prove are A -> C and C -> A. As a general strategy, it is often the easiest to do so with conditional proofs. Given the three assumptions you've been given, it's also a successful strategy.
There's quite a few different syntaxes and allowed procedures (it'd be better to give a link or spell out what you can and cannot use rather than just saying "20-rule proof system").
Here's how I'd do it:
1.| A -> ~ B P
2.| ~C -> B P
3.|_ ~A -> ~C P
4.| |_ A A
5.| | ~B MP 1,4
6.| | ~~C MT 5,2
7.| | C DN 6
8.| A -> C CP 4-7
9.| |_ C A
10.| | ~~C DN 9
11.| | ~~A MT 10
12.| | A DN 11
13.| C -> A CP 10-12
14.| (A -> C) & (C -> A) &I 9,13
15.| A <-> C BiCond. Int 14
In the above A = assumption, | means we are in a subproof, DN = double negation, MT = modus tollens, MP = modus ponens, CP = conditional proof, &I = conjunction introduction, and BiCond Int = biconditional introduction. For some proof systems, you need to use R to repeat things to use them in subproofs (omitted).
The largest dependency in the above is MT. If you need to avoid it, then the basic pattern is:
1.| P -> Q P
2.|_ ~Q P
3.| |_ P A
4.| | Q MP 1,3
5.| | Q & ~Q &I 2,4
6.| ~P ~I 3-5
which you would need to substitute for each use of MT.